1. 程式人生 > >金三銀四Java面試通關要點匯總集(大牛歸納)

金三銀四Java面試通關要點匯總集(大牛歸納)

Java 面試

Java面試通關要點匯總集(部分解答)
說明
如果你有幸能看到的話,

1、本文整體框架來自@阿裏.梁桂釗的博文,總結的非常不錯。值得我們學習,它的博客部分做了解答。
2、由於自己能力有限,沒能實現心中那個想法,就是第一遍自己寫,第二遍書本查詢
3、文章會放到GitHub,用Git控制。可能是一場持續站。
3、如有雷同,純屬意外。會放上你們的鏈接。如有拼寫錯誤,還請諒解。
4、測試放到最後面,有興趣的可以看下?這樣的我能夠入門嗎?
5、苦逼-->傻逼-->二逼-->牛逼
6、自己動手,豐衣足食。看完別人的才知道自己有多大的差距。gogogo。
7、後續先不更新了,目前在做項目實戰,待我找到工作,自己獨立思考總結分享給大家。

基礎篇
基本功
1、面向對象的特性參考
(1)封裝:就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的對象操作,對不可信進行信息隱藏。簡單來說,就是一個類封裝了數據以及操作這些數據的代碼邏輯實體。在一個類的內部,方法或數據可以是私有的,不能被外界訪問。這樣做的目的是對內部數據進行了不同級別的保護,防止錯誤的使用了對象的私有部分。
(2)繼承:它可以使用現有類的所有功能,並在原來的基礎上對這些功能進行擴展。通過繼承創建新類被稱為“子類”或“派生類”。被繼承的類稱為"基類"和“父類”或“超類”。要想實現繼承可以通過“繼承”和“組合(聚合)”:實現方式有:實現繼承和接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外的編碼的能力;接口繼承是指僅使用屬性和方法的名稱,但子類必須提供實現的能力。

(3)多態:是指一個類實例的相同方法在不同情形有不同的表現。多態機制使具有不同內部的結構的對象可以共享的外部接口。雖然針對不同對象的具體操作不同,但通過一個公共的類,他們可以通過相同的方法予以 調用。
最常見的多態就是將子類傳入父類參數中,運行時調用父類方法時,通過傳入的子類決定具體的內部結構或行為。
2、面向對象五大原則:

(1)單一職責原則(Single-Resposiblity-Principle):一個類應該僅有一個引起它變化的原因
(2)開放封閉原則(Open-Closed-Principle):對擴展開放,對更改時封閉的
(3)裏氏替換原則(Liskov-Substituion Principle):子類可以替換父類,並且出現在父類能夠出現的任何地方。GOF倡導面向接口編程

(4)接口隔離原則(Interface-Segregation Principle):使用多個接口比使用單個接口要好的多。
(5)依賴倒置原則(Dependecy-Invarsion Principle):讓高層模塊不要依賴低層模塊。

3、final, finally, finalize 的區別參考
1、final修飾符(關鍵字)
final用於控制成員、方法、或者是一個類是否可以被重寫或者繼承功能。
(1)、如果類被聲明為final,意味著它不能被派生出新的子類,不能作為父類被繼承。
(2)、將變量或方法聲明為final,可以保證他們在使用中不會被改變,其初始化可以在兩個地方:

在final定義時直接給賦值,
在構造函數中,二者只能選其一,在以後的引用中只能讀取,不可修改

2、finally(用於異常處理)
一般是用於異常處理中,提供finally塊來執行任何的清楚操作,try{}catch{}finally{}.finally結構使代碼塊總會執行,不管有無異常發生。使得finally可以維護對象的內部狀態,並可以清理非內存資源。用於關閉文件的讀寫操作或者關閉數據庫連接操作。
3、finalize(用於垃圾回收)
finalize這個是方法名。在Java中,允許使用finalize()方法在垃圾收集器將對象從內存中清理出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是Object中定義的。因此,所有類都繼承了它,finalize方法是在垃圾收集器刪除對象之前對這個對象調用的。
4、int 和 Integer 有什麽區別參考
兩者最大的區別從大的方法來說就是基本類型與其包裝類的區別
int是基本類型,直接存數值,而Integer是對象,用一個引用指向這個對象。
Java中的數據類型分為基本數據類型和復雜數據類型
int是前者,而Integer是後者(是一個類),在進行初始化時,int的變量被初始化為0,而Interger的變量則被初始化null。
5、重載和重寫的區別【參考
重載(OverLoad)
(1)、方法重載是讓類以統一的方式處理同步類型數據的一種手段。在多個同名函數同時存在,具有不同的參數個數、類型。重載(Overload)是一個類中多態性的一種表現。
(2)、Java方法的重載,就是在類中可以創建多個方法,他們具有相同的名字,但是有不同的參數,以及定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用那個方法,這就是多態。
(3)、重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同,也可以不相同。無法以返回值作為重載函數的區別標準
重寫(Override)
(1)、父類和子類之間的多態性,對父類的函數進行重新定義。如果子類定義的方法和父類具有相同的方法名和參數一樣,我們就說該方法被重寫(Override).在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法,但有時子類並不想原封不動地繼承父類方法,而是想做一定的修改,這就需要方法重寫,方法重寫又被稱為方法覆蓋。
(2)、若子類中方法與父類的某個方法具有相同的名稱、返回值、和參數列表,則新方法 將覆蓋原有的方法。如需父類中的原有方法,可以使用super關鍵字,該關鍵字引用了當前類的父類。
(3)、子類函數的訪問修飾權限不能少於父類 。
兩者之間的區別在於:
重寫多態性起作用,對調用被重載過的方法可以大大減少代碼的輸入量,同一個方法名只要往裏面傳遞不同的參數就可以擁有不同的功能或返回值
6、抽象類和接口有什麽區別參考
抽象類是用來捕捉子類的通用特性的。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級裏的子類的模板。
接口是抽象方法的集合,如果一個類實現類某個接口,那麽他就繼承了這個接口的抽象方法。這就像契約模式。如果實現了這個接口,那麽就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。

參數
抽象類
接口

默認的方法實現
它可以有默認的方法實現
接口是完全抽象的,它根本不存在方法的實現

實現
子類使用extends關鍵字來繼承抽象類
子類使用implements來實現接口

構造器
抽象類可以有構造器
接口不能有構造器

修飾訪問符
抽象方法可以有public,protected,和default
接口方法默認 修飾符是public

多繼承
抽象方法可以繼承一個類或實現多個接口
接口只可以繼承一個或多個其他接口

什麽時候使用抽象類和接口

1、如果你擁有一些方法想讓他們中的一些默認實現,那麽使用抽象類。
2、如果你想實現多重繼承,那麽你必須使用接口。由於java不支多繼承,子類不能夠繼承多個類,但可以實現多個接口
3、如果基本功能在不斷改變,那麽就需要使用抽象類。如果不斷改變基本功能並且使用接口 ,那麽就需要改變所有實現了該接口的類。

JDK 8中的默認方法
向接口中引入了默認方法和靜態方法,以此來減少抽象類和接口之間的差異。現在我們可以為接口提供默認實現的方法來,並且不用強制來實現它。
7、說說反射的用途及實現推薦看
Java反射機制是一個非常強大的功能,在很多的項目比如Spring,Mybatis都都可以看到反射的身影。通過反射機制,我們可以在運行期間獲取對象的類型信息。利用這一點我們可以實現工廠模式和代理模式等設計模式,同時也可以解決java泛型擦除等令人苦惱的問題。
獲取一個對象對應的反射類,在Java中有三種方法可以獲取一個對象的反射類,

通過getClass()方法
通過Class.forName()方法;
使用類.class
通過類加載器實現,getClassLoader()

8、說說自定義註解的場景及實現推薦,播客也推薦
跟蹤代碼的依賴性,實現代替配置文件的功能。比較常見的是Spring等框架中的基於註解配置。
還可以生成文檔常見的@See@param@return等。如@override放在方法簽名,如果這個方法 並不是覆蓋了超類方法,則編譯時就能檢查出。使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節,在定義註解時,不能繼承其他註解或接口。
br/>使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節,在定義註解時,不能繼承其他註解或接口。
在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。

GET - 從指定的資源請求數據。
POST - 向指定的資源提交要被處理的數據

GET方法
請註意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的:
/test/demo_form.asp?name1=value1&name2=value2

請求可被緩存
請求保留在瀏覽器歷史記錄中
請求可被收藏為書簽
請求不應在處理敏感數據時使用
請求有長度限制
請求只應當用於取回數據

POST方法
請註意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
比較 GET 與 POST

方法
GET
POST

緩存
能被緩存
不能緩存

編碼類型
application/x-www-form-urlencoded
application/x-www-form-urlencoded 或 multipart/form-data。為二進制數據使用多重編碼。

對數據長度的限制
是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)
無限制。

對數據類型的限制
只允許 ASCII 字符
沒有限制。也允許二進制數據。

安全性
與 POST 相比,GET 的安全性較差,因為所發送的數據是 URL 的一部分。在發送密碼或其他敏感信息時絕不要使用 GET
POST 比 GET 更安全,因為參數不會被保存在瀏覽器歷史或 web 服務器日誌中。

可見性
數據在 URL 中對所有人都是可見的。
數據不會顯示在 URL 中。

其他 HTTP 請求方法

HEAD 與 GET 相同,但只返回 HTTP 報頭,不返回文檔主體。
PUT 上傳指定的 URI 表示。
DELETE 刪除指定資源。
OPTIONS 返回服務器支持的 HTTP 方法
CONNECT 把請求連接轉換到透明的 TCP/IP 通道。

10、session 與 cookie 區別參考,不錯具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。java架構群:582505643 一起交流。

cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中

11、session 分布式處理參考,不錯
第一種:粘性session
粘性Session是指將用戶鎖定到某一個服務器上,比如上面說的例子,用戶第一次請求時,負載均衡器將用戶的請求轉發到了A服務器上,如果負載均衡器設置了粘性Session的話,那麽用戶以後的每次請求都會轉發到A服務器上,相當於把用戶和A服務器粘到了一塊,這就是粘性Session機制
第二種:服務器session復制
原理:任何一個服務器上的session發生改變(增刪改),該節點會把這個 session的所有內容序列化,然後廣播給所有其它節點,不管其他服務器需不需要session,以此來保證Session同步。
第三種:session共享機制
使用分布式緩存方案比如memcached、Redis,但是要求Memcached或Redis必須是集群。
原理:不同的 tomcat指定訪問不同的主memcached。多個Memcached之間信息是同步的,能主從備份和高可用。用戶訪問時首先在tomcat中創建session,然後將session復制一份放到它對應的memcahed上
第四種:session持久化到數據庫
原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優點:服務器出現問題,session不會丟失 缺點:如果網站的訪問量很大,把session存儲到數據庫中,會對數據庫造成很大壓力,還需要增加額外的開銷維護數據庫。
第五種terracotta實現session復制
原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優點:服務器出現問題,session不會丟失 缺點:如果網站的訪問量很大,把session存儲到數據庫中,會對數據庫造成很大壓力,還需要增加額外的開銷維護數據庫
12、JDBC 流程
註意:在此之前應該先把所有用到的對象設為null
(1)向DriverManager類註冊驅動數據庫驅動程序,
Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
(2)調用DriverManager.getConnection方法, 通過JDBC URL,用戶名,密碼取得數據庫連接的Connection對象。
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor", //URL
"myLogin", // 用戶名
"myPassword" ); // 密碼
(3)獲取Connection後, 便可以通過createStatement創建Statement用以執行SQL語句。下面是一個插入(INSERT)的例子:
Statement stmt = conn.createStatement();
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( ‘my name‘ ) " );
(4)有時候會得到查詢結果,比如select,得到查詢結果,查詢(SELECT)的結果存放於結果集(ResultSet)中。
ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );
(5)關閉數據庫語句,關閉數據庫連接。
rs.close();
stmt.close();
13、MVC 設計思想
每當用戶在Web瀏覽器中點擊鏈接或提交表單的時候,請求就開始工作了。請求是一個十分繁忙的家夥,從離開瀏覽器開始到獲取響應返回,它會經歷很多站,在每站都會留下一些信息,同時也會帶上一些信息。

Spring工作流程描述原文在這裏

用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;

DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然後根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;

DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)

提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中

Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;

根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

ViewResolver 結合Model和View,來渲染視圖

將渲染結果返回給客戶端。

技術分享圖片
圖片參考這裏

Spring工作流程描述

為什麽Spring只使用一個Servlet(DispatcherServlet)來處理所有請求?
詳細見J2EE設計模式-前端控制模式
Spring為什麽要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是代碼可復用性高。如HandlerAdapter可能會被用於處理多種Handler。

1、請求旅程的第一站是Spring的DispatcherServlet。與大多數基於Java的Web框架一樣,Spring MVC所有的請求都會通過一個前端控制器(front contrller)Servlet.前端控制器是常用Web應用程序模式。在這裏一個單實例的Servlet將請求委托給應用的其他組件來執行實際的處理。在Spring MVC中,DisPatcherServlet就是前端控制器。
2、DisPactcher的任務是將請求發送Spring MVC控制器(controller).控制器是一個用於處理請求的Spring組件。在典型的應用中可能會有多個控制器,DispatcherServlet需要知道應該將請求發送給那個哪個控制器。所以Dispactcher以會查詢一個或 多個處理器映射(Handler mapping),來確定請求的下一站在哪裏。處理映射器根據請求攜帶的 URL信息來進行決策。
3、一旦選擇了合適的控制器,DispatcherServlet會將請求發送給選中的控制器。到了控制器,請求會卸下其負載(用戶提交的信息)並耐心等待控制器處理這些信息。(實際上,設計良好的控制器 本身只是處理很少,甚至不處理工作,而是將業務邏輯委托給一個或多個服務器對象進行處理)
4、控制器在完成處理邏輯後,通常會產生一些信息。這些 信息需要返回給 用戶,並在瀏覽器上顯示。這些信息被稱為模型(Model),不過僅僅給用戶返回原始的信息是不夠的----這些信息需要以用戶友好的方式進行格式化,一般會是HTML。所以,信息需要發送一個視圖(View),通常會是JSP。
5、 控制器做的最後一件事就是將模型打包,並且表示出用於渲染輸出的視圖名。它接下來會將請求連同模型和視圖發送回DispatcherServlet。
6、這樣,*控制器就不會與特定的視圖相耦合傳遞給控制器的視圖名並不直接表示某個特定的jsp。實際上,它甚至並不能確定視圖就是JSP。相反,它僅僅傳遞了一個邏輯名稱,這個名字將會用來查找產生結果的真正視圖。DispatcherServlet將會使用視圖解析器(View resolver),來將邏輯視圖名稱匹配為一個特定的視圖實現,他可能也可能不是JSP
7、雖然DispatcherServlet已經知道了哪個駛入渲染結果、那請求的任務基本上也就完成了,它的最後一站是試圖的實現。在這裏它交付給模型數據。請求的任務就結束了。視圖將使用模型數據渲染輸出。這個輸出通過響應對象傳遞給客戶端(不會像聽上去那樣硬編碼)
可以看到,請求要經過很多步驟,最終才能形成返回給客戶端的響應,大多數的 步驟都是在Spirng框架內部完成的。
14、equals 與 == 的區別參考技術分享圖片

1、使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
2、==返回true如果兩個引用指向相同的對象,equals()的返回結果依賴於具體業務實現
3、字符串的對比使用equals()代替==操作符
其主要的不同是一個是操作符一個是方法,==用於對比原生類型而equals()方法比較對象的相等性。

有興趣可以看下我的解答,沒有對比就沒傷害。
1、軟實力
1、說說你的亮點
之前一個人徒搭川藏線、青藏線。當淩晨站在布達拉宮的廣場時,哪種成就感無法比喻,只能經歷過的人才能體會到。經歷過底層的生活,去過邊陲雲南,也去過北上杭。體驗了一回流浪漢給讓鋪位的經歷。讓我對這個世界有了全新的認識。(這裏只想提示面試官我有堅毅、不怕吃苦、有善心的品質)
技術方面:目前不才,沒有解決過重大問題的經歷。有一顆持續學習的心(英語很重要,很重要,很重要)。以後會養成一個寫播客的習慣,混跡於GitHub。
2、說說你最近在看什麽書
《Spring 實戰》,這本書寫的非常不錯,深入的闡述了Spring的IOC和AOP特性。講解了Spring生態系統中常用的組件。結合作者的GitHub代碼示例,學習起來效果很好。
下一本會是《Spring Boot實戰》
下下一本會是《Netty 實戰》看第一章就深深的迷上了。
3、說說你覺得最有意義的技術書籍
個人認為是 Xxx是怎麽Xx的(日系)。Xxx實戰系列。Xxx權威指南,國產深入Xxx也不錯。還有一些是計算機底層的書籍。
4、工作之余做什麽事情
目前沒工作,除了學習還是學習。假設有了工作,會學習英語,為自己的三年計劃做準備。時不時會跑回去看父母(飛機)。
5、說說個人發展方向方面的思考
最近"移民"關鍵字很火熱。會在國內待三年,讓自己能獨當一面。會在國外發展自己的仕途,在技術的路上一道走到黑。
6、說說你認為的服務端開發工程師應該具備哪些能力
網絡必備,高並發,JVM必會,各種分布式技術,看源碼的能力。
7、說說你認為的架構師是什麽樣的,架構師主要做什麽
技術大拿,在多個領域有深入的研究。協調各個技術專家可以很好的一起工作。特定領域的架構師職能不一樣,網絡,底層,數據庫。在一個點上可以獨當一面,解決各大重大問題。
8、說說你所理解的技術專家
混跡於戰場最起碼十年,而且是在特定領域有自己獨特的理解。對細節問題的掌握,遇到的問題比別人多,解決的問題也比別人多。假設是Java技術專家,JKD源碼,JVM,設計模式(不是記住,應用到項目中)。對特大項目重構。越厲害,越底層。當有一天你什麽都不懂了,就成技術專家了。
基本功
1、面向對象的特征
講特征之前你得知道什麽是面對對象吧,面向對象OO = 面向對象設計OOD + 面向對象分析OOA + 面向對象編程OOP。還有什麽面相呢?面向過程編程、面向接口編程、面向切面編程AOP、面向資源編程。什麽是對象?對象怎麽產生的?new Class啊(內省反射機制,容器)。對象定義了什麽?之間有什麽聯系?對象是對現實世界的抽象。對象是由類實例化產生的,描述了類的一些屬性和行為。是強耦合,還是虛耦合?是繼承關系還是組合關系(is-a,has-a)?

具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。java架構群:582505643 一起交流。

繼承:子類(衍生類)繼承父類(超類)用來延續父類功能,子類本身也可以增強。所有類都繼承自Object。單繼承局限,為啥所有類都要繼承Object?如何實現多繼承呢?是用繼承好還是組合(聚合)好?委托?

封裝:你可能聽過給我封裝一個工具類,為什麽要封裝?解耦。怎麽封裝?抽取。封裝方法還是封裝類?如何隱藏自己,改變的同時不影響到別人?4個關鍵字,public,private...

多態:一種事物所呈現出不同的狀態,人會吃,會跑,會跳,會睡?根據大腦給它傳遞什麽消息。這裏涉及到轉型,向上轉安全嗎?向下呢?(no,yes)。這樣會丟失對象一些特性。

具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。java架構群:591240817 一起交流。
2、final, finally, finalize 的區別

final:最終的,修飾常量,final static。用大寫字母描述。靜態的不變的。在哪裏會用到全局變量?局部呢?修飾方法,子類不能被覆蓋(重寫),修飾類(父類不能被繼承) String類被final了。為什麽要這樣設計?性能,安全、池。
finally:一般在try{}catch{}finally{}中釋放資源,IO,線程。不管如何總是會執行?真的嗎,未必。還需要判斷,非空,在try一次。JDK 8可以直接放在try(...){}catch{}

finalize:是一個本地方法,由JVM full GC的時候調用清理不再存活的對象。什麽時候執行?一次兩次?
3、int 和 Integer 有什麽區別
前者是基本數據類型,後置是引用數據類型,之間如何轉換的?能放到集合中嗎?JDK 1.5自動裝箱、拆箱。還有一點到底是值傳遞還是引用傳遞啊?
4、重載和重寫的區別

用在多態上。方法名相同,參數列表、屬性不同的方法。根據傳參不同選擇合適的方法。構造函數也是
重寫:用在繼承。方法名相同,參數也一樣。父類的方法不能滿足需求時,加以增強補充。用的時候到底調用子類還是父類的啊?super,this。這裏會涉及到類的加載過程?還有static代碼塊。

5、抽象類和接口有什麽區別

抽象類:用abstract修飾的類叫抽象類,定義類的時候往上層抽象,子類繼承的時候必須全部實現,如不,那也是一個抽象類。類和接口之間的橋梁?
接口:用interface修飾定義了一些標準方法,方法默認是public abstract修飾的,沒有方法體。JDK 8可以包含默認方法,有什麽作用?要麽全部實現,要麽都不實現。但默認方法來了。避免單繼承局限,可以實現多個接口

兩者都不能被實例化,一個用來被繼承,一個用來被實現。到底用哪個好?取決於你的類的設計。面向接口編程。中間過渡抽象類。頂層接口項目一般會有一個抽象類。在往下才是實現類。
6、說說反射的用途及實現
要是沒反射+泛型這個世界會變的怎樣?在運行時動態的創建對象,通過類的全限定名我們可以知道類的任何信息。字段,方法、構造方法、異常、註解。幾乎每個框架都幾乎反射+泛型實現的。還有動態代理。底層使用靜態代碼塊實現,。實現方法是有四種:類.class,類.getClass(),Class.forName(),還有一種是類的加載器實現,getClassloader().(啟動、擴展、系統(App)).再次強調反射+泛型+代理(JDK,CGlib)很重要。
7、說說自定義註解的場景及實現
非常非常非常的重要,在框架中可以幫我們省去很多不必要的代碼。Java規定一個類上不能出現一樣的註解,那麽我們就可以自定義。
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();}
@Retention(RetentionPolicy.RUNTIME)
br/>}
@Retention(RetentionPolicy.RUNTIME)
br/>@Inherited
Class<? extends Runner> value();
}
8、HTTP 請求的 GET 與 POST 方式的區別
用於提交獲取表單、資源。主要區別在於地址欄,緩存、大小。網絡知識也得好好了解。

GET 提交的數據地址欄一般會出現鍵值對的形式,用“&”相連.大小也有限制(64k?)。能緩存。
POSP 用於提交表單、上傳圖片。數據一般放到請求體中。大小沒限制。不能被緩存。

其他的呢?put?delete,trance? 這裏又扯到TESTful風格。
9、session 與 cookie 區別
最大的區別在於存放的位置不同,前者在服務端,後者在本地。但是本例瀏覽器要是限制cookie呢?題外話:我一般會經常用Click&Clean清除cookie的。有些網站也會禁用。別問我為什麽,其實並無卵用,但是cookie裏保存著大量重要信息。
技術分享圖片

cookie :一般存放密碼,令牌之類的信息。大小有限制,在第一次請求的時候,服務端創建,返回給客戶端,第二次請求瀏覽器帶著cookie去找服務器。這裏有個跨域問題? 可以設置過期失效。瀏覽器對cookie的限制。大量的cookie導致傳輸性能。通常會采用Gzip壓縮。
Session,存放於服務端。一般用於購物車也涉及到跨域問題,可以存放到redis中,還有一種辦法復制的每個tomcat實例中,現實嗎?Jsession什麽東東?有什麽作用?

這塊只是得好好補補。
10、session 分布式處理
哈哈,搶先回答了。大家面試的時候不要一問一答。讓面試官在你的問題中選擇一個解答繼續深入。直到問道你不會。也可以說些自己有把握話題,引導他繼續深入。
11、JDBC 流程
準備 private static final URL、、、 也可以用properties從文件中讀取。load()、
1、首先註冊驅動啊?怎麽註冊?反射啊,Class.forName("xx.xx.xx.Driver");底層怎麽實現的?靜態代碼,DriverManager.registerDriver?啟動的時候,會自動調用靜態代碼塊的內容。
2、接下來就是獲取連接啊,怎麽連接?遠程連接(三次握手操作),連接放哪裏?作為資源必須放池子裏。這樣能提高性能。常見的連接池有DBCP,C3P0,傳說中最安全,性能最好的Druid(國產),而且還能監控。
3、你總的有SQL語句吧,之後就是Statement編譯那。這裏會出現SQL註入的安全問題。在語句後面加"1=1"成立。所以我們采用預編譯的方式,PreparedStatement。可以防止這種問題的出現。
4、查完之後獲取結果集。rs.getString().
5、頭疼的來了,釋放資源。各種 if(xx != nu) {try{ xx.close();}catch{}} 不用擔心JDK8 出來一個新特性,可以放在try-withresource中。還有各種異常可以采用通道的形式 XxxException | XxxException
6、各種異常需要你放到一個try{}catch{}中,出問題你也不知道問題在哪裏?
麻煩嗎?不用擔心,我們可以封裝成一個工具類,需要的時候調用工具類.getConnection();
還是麻煩啊,可以用Spring框架為我們集成提供了jdbcTemplate,HibernaterTemplate。用模板代碼消除了大量的樣板代碼。
為啥不早告訴我JDBC連接這麽簡單?同誌們,我們需要知其然的同時,還要知其所以然。這樣出現問題的時候才能找到更好的解決方法。
12、MVC 設計思想
什麽是設計思想?前人踩過無數的坑,總結出來的真理。一般用來解決特定問題。需要好好學習設計模式,框架中大量采用.
那MVC又是什麽東東?
回答之前我們先看看設計的原則。單一職責,開閉原則,面向接口編程,對象最少知道。一句話總結:“高內聚,低耦合”。六個字一個逗號。

Model(模型層) :一般存放處理邏輯,
View (視圖層):存放html,jsp,文件
Controller(控制層):主要負責調度兩者,實現解耦。

當我們像瀏覽器發送一個請求時,首先需要經過控制層(DispatcherServlet),其是它實際不做什麽事情,委托給別人做。調用模型層(處理一些業務邏輯),返回數據模型給控制器,接著在委托視圖解析器解析視圖。最後定位到視圖的資源,返回給控制器,控制器在返回給客戶端。(其實需要做的還有很多)
主要的目的是解耦,各司其職。做好你份內的事。對擴展性也好。增加需求不會影響到其他模塊。
13、equals 與 == 的區別

== 比較的是地址,具體來說就是存放在棧中的引用。
equsls 比較的是內容。一般我們同時需要重寫hashcode()方法,其底層是用“==”

這裏分兩種情況,基本類型和引用類型的比較。還會涉及到一個常量池(提高性能)。還有入池操作。還有四條原則,自反,傳遞,。。

金三銀四Java面試通關要點匯總集(大牛歸納)