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

來源:互聯網
上載者:User

標籤: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中的資料類型分為基礎資料型別 (Elementary Data Type)和複雜資料類型
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等架構中的基於註解配置。
還可以產生文檔常見的@[email protected]@return等。如@override放在方法簽名,如果這個方法 並不是覆蓋了超類方法,則編譯時間就能檢查出。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 更安全,因為參數不會被儲存在瀏覽器曆史或 網頁伺服器日誌中。

可見度
資料在 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 有什麼區別
前者是基礎資料型別 (Elementary Data Type),後置是引用資料類型,之間如何轉換的?能放到集合中嗎?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();br/>}
@Retention(RetentionPolicy.RUNTIME)
@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面試通關要點匯總集(大牛歸納)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.