本文小結了JAVA常見的基礎面試問題,希望對大家面試有幫助。
知識點拓展的鏈接均爲自己這一個月內整理的文章是相關知識點詳解。
Welcome reading and learning to progress together.
- 程序員簡歷模板請參考:簡歷製作—心得分享
- JAVA框架面試知識點參考:JAVA框架面試彙集
- 1.Java 的多態表現在哪裏?
- 多態要有動態綁定,否則就不是多態,方法重載也不是多態(因爲方法重載是編譯期決定好的,沒有後期也就是運行期的動態綁定)
- 多態當滿足這三個條件
1.有繼承 2. 有重寫 3. 要有父類引用指向子類對象
- 2.抽象類與接口的區別
- (1)
一個類只能繼承一個抽象類,一個類可以實現多個接口
- (2)抽象類中可以存在非抽象方法,接口中的方法都是抽象方法
- (3)抽象類可以有私有的成員變量和成員方法,接口中的方法全部默認的修飾爲public abstract 類型的方法
- (4)實現抽象類的方法時,如果方法是抽象的,子類必須重寫抽象方法,如果方法不是抽象的,子類可以選擇繼承;實現了接口就必須重寫接口中的所有方法
- 3.解釋方法重寫與方法重載
- 方法重寫:
子類繼承父類時,存在與父類中某一方法相同的方法名,返回類型和參數列表,則子類方法將覆蓋父類原有的方法。
方法重寫特性:方法重寫的返回值、方法名、參數列表必須完全一致。 - 方法重載:
在一個類中具有多個函數名相同,參數列表不同的方法
。參數列表不同包含參數個數和類型的不同。
-
4.==和equals()的區別
-
①關於==解讀:
-
基本數據類型:比較的是值是否相同
-
引用數據類型:比較的是引用(地址)是否相同
-
②關於equals解讀:
-
對於重寫equals方法的引用數據類型:比較的是值是否相同
-
對於未重寫equals方法的引用數據類型,源碼繼承object的equals方法,等同於==,即比較引用(地址)是否相同
-
補充源碼:
- 5.&與&&的區別
- ①
&與&&都可以用做邏輯與運算符
,表示邏輯與(and),當運算符兩邊的表達式結果都爲true時,整個運算的結果才爲true,否則爲false - ②
&&具有短路功能
,即如果第一個表達式爲false,則不再計算第二個表達式 - ③
&還可以用作位運算符
,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作
- 6.final, finally, finalize的區別?
- ①
final修飾的類不可被繼承,被final修飾的方法不可被重寫,被final修飾的變量。
- ②finally:異常處理語句結構的一部分,表示總是執行。
- ③finalize:Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
- 7.StringBuffer 和 StringBuilder的區別
常考
- 最主要的:
StringBuffer:線程安全
,StringBuilder:線程不安全
- 參考我的文章:StringBuffer 和 StringBuilder的面試詳解
- 同步參考:JAVA中String介紹以及常見面試題
- 8.ArrayList和LinkedList區別
聯繫:ArrayList與LinkedList都是List接口的實現類,都表示元素有序可重複的單值集合
- ①ArrayList是基於數組的實現,元素的查詢和修改效率較高,但是元素的插入和刪除效率較低。
- ②LinkedList是基於鏈表的實現,元素的插入和刪除效率較高,但是元素的查詢和修改效率較低。
- 詳解參考我的文章:List和Set集合基礎詳解
9.HashMap與ConcurrentHashMap的區別?
- ①聯繫:HashMap與ConcurrentHashMap都是基於哈希表(數組、鏈表、紅黑樹)的存儲。
- ②區別:
HashMap是非線程安全的,而ConcurrentHashMap是線程安全的
,它在HashMap的基礎上加入了分段鎖的概念,即創建的Map的初始數組中的每一個元素爲一個區塊(segment),當線程A對鍵值對進行操作時只會鎖住當前區塊,而不影響對其它區塊的操作,提高了Map在多線程併發操作時的效率。 - 想了解HashMap可以參考:HashMap原理分析及性能優化
-
10.列舉10個常見異常
-
NullPointerException 空指針異常 、 ClassNotFoundException 類找不到異常
-
ArithmeticException 數學運算異常、 IndexOutOfBoundsExcept 下標越界異常
-
IllegalArgumentException 非法參數異常 、 FileNotFoundException 文件未找到異常
-
NumberFormatException 字符串轉爲數字異常、 EOFException 文件已結束異常
-
SQLException 操作數據庫異常、 IOException 輸入輸出異常
- 11.進程與線程的區別
- 進程是資源分配的最小單位,線程是程序執行(資源調度)的最小單位
- 詳細請參考:進程和線程的常見面試問題
- 12.線程的狀態
常考
- ①
新建狀態(New)
:當線程對象創建後即進入新建狀態 - ②
就緒狀態(Runnable)
:當調用線程對象的start()方法後,線程即進入就緒狀態,等待CPU調度 - ③
運行狀態(Running)
:當CPU開始調度處於就緒狀態的線程時,線程即進入運行狀態 - ④
阻塞狀態(Blocked)
:處於運行狀態中的線程由於某種原因,暫時放棄了對CPU的使用權,停止執行,即進入阻塞狀態,直到其進入就緒狀態纔有機會獲得CPU的調度而進入運行狀態,根據阻塞原因的不同,阻塞狀態分爲:等待阻塞(wait)、同步阻塞(synchornized)、其它阻塞(sleep、join) - ⑤
死亡狀態(Dead)
:線程執行完後或因異常而退出了run()方法,該線程的生命週期結束 - 補充:
建議瞭解線程的三種創建方式!!!反正我面試的時候被問過!
- 詳細參考:進程和線程的常見面試問題
-
13.簡述線程池及工作原理
-
線程池是管理線程的容器,先啓動若干數量的線程,並讓這些線程都處於睡眠狀態,當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求後,線程又處於睡眠狀態
-
小結:
線程池是面向後臺程序的,是爲了提高內存和CPU效率
。
- 14.簡述MySQL數據庫索引原理
- 定義:索引是幫助MySQL高效獲取數據的數據結構。
- 原理:傳統查詢方法是按照表的順序遍歷的,添加索引後可以根據BTREE算法生成一個索引文件,在查詢數據庫時,找到索引文件進行遍歷,找到相應的鍵從而獲取數據。
- MYSQL進階請參考:MYSQL性能優化
- 15.數據庫事務的四大特性(ACID),並闡述
- ①原子性(Atomicity):一個事務中的多個步驟要麼全部完成,要麼全部不做
- ②一致性(Consistency):在事務開始之前和事務完成之後,數據庫中數據的完整性和一致性不能被破壞
- ③隔離性(Isolation):數據庫允許多個事務併發,但多個事務之間不能相互交叉執行從而導致數據不一致,多個並行的事務之間不能相互影響
- ④持久性(Durablity):事務完成後,對數據的操作是永久的
- 16.簡述事物的隔離級別
- 讀未提交(Read uncommitted):就是一個事務可以讀取另一個未提交事務的數據。
- 讀已提交(Read committed):就是一個事務要等待另一個事務提交後才能讀數據。
- 重複讀(Repeatable Read):就是在開始讀數據時,不再允許修改操作。
- 序列化(Serializable):最高的事務隔離級別,事務串行化順序執行,可以避免髒讀、不可重複度、幻讀,但是這種事務隔離級別效率低下,比較消耗數據庫性能,一般不使用。
-
17.簡述數據庫連接池
-
數據庫連接池是管理數據庫連接的容器
,數據庫連接是一種關鍵的、有限的、昂貴的資源,一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的性能低下。 -
作用:
連接池技術儘可能多地重用了消耗內存地資源,大大節省了內存,提高了服務器地服務效率,能夠支持更多的客戶服務
。通過使用連接池,將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。 -
小結:
連接池是面向數據庫連接的,是爲了優化數據庫連接資源
- 18.Servlet生命週期
常考
Servlet是單實例多線程的,自始至終只會創建一個對象來響應用戶請求。
①如果web.xml中沒有配置load-on-startup
,則當用戶第一次請求到達時創建servlet類的對象,然後使用該對象依次調用service(ServletRequest,ServletResponse)—service(HttpServletRequest,HttpServletResponse)—doGet/doPost方法響應用戶請求;當用戶請求再次到達時,不會重新創建對象,直接使用已經創建的對象調用service—service—doGet/doPost進行響應。②
如果web.xml中有該Servlet的load-on-startup配置
,則服務器啓動時會按照load-on-startup配置的加載順序依次創建Servlet對象,當請求到達時直接使用對象調用service-service-doGet/doPost方法進行相應。
③當服務器關閉時,就銷燬Servlet對象實例
- 詳細瞭解參考:Servlet生命週期及Servlet類詳解
- 19.簡述JSP九大內置對象
雖然JSP很少用了還是建議瞭解一點內置對象
- request該對象代表了客戶端的請求信息,主要用於接受通過HTTP協議傳送到服務器的數據 作用域:一次請求
- response 該對象代表服務器對客戶端的響應,主要是將JSP容器處理過的數據傳回到客戶端 作用域:JSP頁面內
- session 從一個客戶打開瀏覽器並連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱爲一個會話 作用域:瀏覽器
- application 全局對象 服務器開啓時創建,服務器關閉時銷燬 所有用戶共享該全局對象
- out 表示指向當前JSP頁面的輸出流,可以通過該對象將指定的內容寫出到JSP文件的指定位置
- page 代表JSP本身,只有在JSP頁面內合法
- config 該對象的作用是取得當前頁面在服務器上的配置信息
- exception 該實例代表其他頁面中的異常和錯誤。只有當頁面是“錯誤處理頁面”,即編譯指令page 的isErrorPage
屬性爲true 時,該對象纔可以使用。 - pageContext 作用是取得任何範圍內的參數 通過它可以獲得JSP頁面的其他對象
- 20.說說你對反射機制的理解
- JAVA反射機制是在運行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;
這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
- 應用:通過反射機制獲取註解信息 動態代理 逆向代碼 基礎框架應用廣泛。
- 21.Collection 和 Collections的區別?
Collection:集合類的上級接口
,繼承與他的接口主要有Set 和List.Collections:針對集合類的一個幫助類
,提供了一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
- 22.TCP 與 UDP 的區別:
TCP(Transmission Control Protocol,傳輸控制協議)
是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。UDP(User Data Protocol,用戶數據報協議)
, UDP 是一個非連接的協議,傳輸數據之前源端和終端不建立連接。(不安全)
- 1 .基於連接與無連接;
- 2 .對系統資源的要求(TCP 較多,UDP 少);
- 3 .UDP 程序結構較簡單;
- 4 .流模式與數據報模式 ;
- 5 .TCP 保證數據正確性,UDP 可能丟包,TCP 保證數據順序,UDP 不保證。
- 23.cookie 和 session 的區別,分佈式環境怎麼保存用戶狀態;
- ①
session 保存在服務器
,客戶端不知道其中的信息;cookie 保存在客戶端
,服務器能夠知道其中的信息。 - ②session 中保存的是對象,cookie 中保存的是字符串。
- ③session 不能區分路徑,同一個用戶在訪問一個網站期間,所有的 session 在任何一個地方都可以訪問到。而 cookie
中如果設置了路徑參數,那麼同一個網站中不同路徑下的 cookie互相是訪問不到的。 - ④session 需要藉助 cookie 才能正常。如果客戶端完全禁止 cookie,session 將失效。
- 詳細解答參考我的文章:徹底瞭解Cookie和Session的區別(面試)
- 24.wait 和 sleep 的區別;
我面試的時候考的
- ①
sleep()是 Thread 類中的方法,而 wait()則是 Object 類中的方法
。 - ②
sleep()方法導致了程序暫停,但是他的監控狀態依然保持着
,當指定的時間到了又會自動恢復運行狀態。在調用sleep()方法的過程中,線程不會釋放對象鎖。 - ③
wait()方法會導致線程放棄對象鎖,進入等待此對象的等待鎖定池
,只有針對此對象調用notify()方法後本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態。
-
25.簡述HashMap存儲過程
-
HashMap中鍵值對是基於哈希表(數組+鏈表+二叉樹)的存儲。
-
①.當我們創建一個HashMap集合時,默認創建一個初始長度爲16的數組(加載因子爲0.75);
-
②.當我們向HashMap中添加鍵值對的時候,首先根據鍵值對鍵的hash碼除以數組的長度取餘以確定鍵值對在map中的位置
-
③.當這個位置有多個鍵值對時,以鏈表的結構進行存儲;
-
④.在JDK8中,當鏈表長度大於8時,則將鏈表結構轉換爲二叉樹進行存儲
擴容原理:當map的數組中元素超過數組長度的75%時,表示需要擴容(擴容算法<<1),每次擴容都會導致對所有鍵值對進行重新排列,會影響map的性能,所以在實際開發中要儘量避免無謂的擴容。
- HashMap性能詳解請參考:HashMap原理分析及性能優化
- 26.Redis相關問題我已經整理:Redis的面試基礎知識詳解
Thank you very much for your reading. I hope we can all be good programmers.
2020.03.12 辰兮的第26篇博客 thanks~