想要找到一份好的工作,面試是少不了的,可能你覺得自己技術應該不錯了,但是面試卻是一團糟。下面我收集了八個常常被問到的Java面試題。

1. 闡述 Java 7 和 Java 8 的區別。
實話說,兩者有很多不同。如果你能列出最重要的,應該就足夠了。你應該解釋 Java 8 中的新功能。想要獲得完整清單,請訪問官網:Java 8 JDK。
你應該知道以下幾個重點:
- lambda 表達式,Java 8 版本引入的一個新特性。lambda 表達式允許你將功能當作方法參數或將代碼當作數據。lambda 表達式還能讓你以更簡潔的方式表示只有一個方法的接口 (稱為函數式接口) 的實例。
- 方法引用,為已命名方法提供了易於閱讀的 lambda 表達式。
- 默認方法,支持將新功能添加到類庫中的接口,並確保與基於這些接口的舊版本的代碼的二進制兼容性。
- 重復注解,支持在同一聲明或類型上多次應用同一注解類型。
- 類型注解,支持在任何使用類型的地方應用注解,而不僅限於聲明。此特性與可插入型系統一起使用時,可增強對代碼的類型檢查。
2. 你了解哪些集合類型?
你應該知道以下幾個最重要的類型:
- ArrayList
- LinkedList
- HashMap
- HashSet
之后,你可能會被問到這樣一些問題,比如何時應該使用此種特定類型,它比其他的好在哪里,它是怎么存儲數據的以及隱匿在其后的數據結構是什么。
最好的方法是盡可能多地了解這些集合類型,因為這類問題幾乎是無窮盡的。
3. Object 類包含哪些方法?
這是一個非常常見的問題,用來確定你對基礎知識的熟悉程度。以下是每個對象都具有的方法:
在 java.lang 包中,Object 類位於類層次結構的頂端。每個類都是 Object 類直接或間接的子類。你使用或編寫的每個類都繼承了 Object 類中的實例方法。你並不需要使用這些方法中的任何一種,但是,如果你選擇這樣做,則可能需要用你的類的特定代碼來重寫這些方法。以下是本節所討論的從 Object 類中繼承的方法:
- protected Object clone throws CloneNotSupportedException 創建並返回此對象的副本。
- public boolean equals(Object obj) 判斷另一對象與此對象是否「相等」。
- protected void finalize throws Throwable 當垃圾回收機制確定該對象不再被調用時,垃圾回收器會調用此方法。
- public final Class getClass 返回此對象的運行時類。
- public int hashCode 返回此對象的散列碼值。
- public String toString 返回此對象的字符串表示形式。
Object 類的 notify,notifyAll 和 wait 方法都在同步程序中獨立運行線程的活動方面發揮了作用。
- public final void notify
- public final void notifyAll
- public final void wait
- public final void wait(long timeout)
- public final void wait(long timeout, int nanos)
4. 為什么 String 對象是不可變的?
- 因為字符串在 Java 中是不可變的,由此 Java 運行時環境節省了大量堆空間,因為不同的 String 變量可以引用池中的同一 String 變量。如果 String 不是不可變的, 則字符串駐留(String interning)將是不可能的,因為一旦任一變量更改所引用的String對象的值,它也會反映在其他變量中。
- 如果字符串不是不可變的,那么它可能會對應用程序造成嚴重的安全威脅。例如,數據庫用戶名和密碼都作為 String 傳遞以獲取數據庫連接,Socket 編程的主機和端口信息也是如此。由於字符串是不可變的,因此其值不能被更改。否則,任何黑客都可以篡改其引用的值,這會導致應用程序中的安全問題。
- 由於 String 是不可變的,因此它對與多線程處理來說是安全的,並且可以在不同的線程之間共享單個 String 實例。這避免了為線程安全使用同步;字符串是隱式線程安全的。
- 字符串被用在 Java 類加載器中,其不可變性為類加載器加載正確的類提供了安全性。否則的話,請考慮這樣一個危險的情況,在你嘗試加載 java.sql.Connection 類時,你引用的值卻被更改為 myhacked.Connection,並且它能對數據庫執行你不需要的操作。
- 由於 String 是不可變的,因此在它被創建時其散列碼就被緩存,不需要再次計算。這使得它成為映射中鍵的理想對象,它的處理速度比其他HashMap 鍵類型快。這就是為什么 String 是 HashMap 中最常用的鍵類型。
5. final,finally,和 finalize 三者之間有什么不同?
- final 關鍵字用於在多個語境下定義只能分配一次的實體。
- finally 代碼塊是用於執行重要代碼 (如關閉連接、流等) 的代碼塊。無論是否處理異常,finally 代碼塊總會被執行。finally 代碼塊緊隨 try 代碼塊或 catch 代碼塊。
- finalize 是在刪除或銷毀對象之前垃圾回收器總會調用的方法,該方法使得垃圾回收機制能夠執行清理活動。
6. 如何使一個類不可變?
- 將類聲明為 final,使其無法被繼承。
- 所有域都用 private 修飾,不允許直接訪問。
- 不提供變量的 setter 方法。
- 所有可變域都用 final 修飾, 使它的值只能分配一次。
- 通過構造函數執行深克隆初始化所有域。
- 對 getter 方法獲取的對象執行克隆以返回副本,而不是返回實際的對象引用。
7. 什么是單例模式?
單例模式是指一個類僅允許創建其自身的一個實例,並提供對該實例的訪問權限。它包含靜態變量,可以容納其自身的唯一和私有實例。它被應用於這種場景——用戶希望類的實例被約束為一個對象。在需要單個對象來協調整個系統時,它會很有幫助。
8. 什么是依賴注入?
依賴注入是spring框架中的解耦的一種策略,稱為DI,主要有set方式(提供set和get方法)和constractor(構造方法)方式,它使得類與類之間以配置文件的形式組織在一起,而不是硬編碼的方式
以上就是常見的八個Java面試題,如果你了解這些問題,我相信你能在面試中獲得很大的優勢,即使這次面試沒有被問到,很可能下次的面試中就會被問到了哦。好了,今天我們就聊到這里,小伙伴們下個主題見。