經常被問到的十個 Java 面試題?你Get了嗎?

  1. 以滿分十分來評估自己——你有多擅長 Java?

如果你並不完全確信你自己或是你對 Java 的熟練程度,那麼這會是一個非常棘手的問題。如果有這種情況,你應該把打分調低一點。之後,你大概會得到與你承認的水平相符的問題。因此,假如你給自己滿分,卻不能回答一個有點難的問題,那將會對你不利。

  1. 闡述 Java 7 和 Java 8 的區別。

實話說,兩者有很多不同。如果你能列出最重要的,應該就足夠了。你應該解釋 Java 8 中的新功能。想要獲得完整清單,請訪問官網:Java 8 JDK。

你應該知道以下幾個重點:

lambda 表達式,Java 8 版本引入的一個新特性。lambda 表達式允許你將功能當作方法參數或將代碼當作數據。lambda 表達式還能讓你以更簡潔的方式表示只有一個方法的接口 (稱爲函數式接口) 的實例。

方法引用,爲已命名方法提供了易於閱讀的 lambda 表達式。

默認方法,支持將新功能添加到類庫中的接口,並確保與基於這些接口的舊版本的代碼的二進制兼容性。

重複註解,支持在同一聲明或類型上多次應用同一註解類型。

類型註解,支持在任何使用類型的地方應用註解,而不僅限於聲明。此特性與可插入型系統一起使用時,可增強對代碼的類型檢查。

  1. 你瞭解哪些集合類型?

你應該知道以下幾個最重要的類型:

ArrayList

LinkedList

HashMap

HashSet

之後,你可能會被問到這樣一些問題,比如何時應該使用此種特定類型,它比其他的好在哪裏,它是怎麼存儲數據的以及隱匿在其後的數據結構是什麼。

最好的方法是儘可能多地瞭解這些集合類型,因爲這類問題幾乎是無窮盡的。

  1. 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)

  1. 爲什麼 String 對象是不可變的?

字符串池之所以可能,就是因爲字符串在 Java 中是不可變的。由此 Java 運行時環境節省了大量堆空間,因爲不同的 String 變量可以引用池中的同一 String 變量。如果 String 不是不可變的, 則字符串駐留(String interning)將是不可能的,因爲一旦任一變量更改所引用的String對象的值,它也會反映在其他變量中。

如果字符串不是不可變的,那麼它可能會對應用程序造成嚴重的安全威脅。例如,數據庫用戶名和密碼都作爲 String 傳遞以獲取數據庫連接,Socket 編程的主機和端口信息也是如此。由於字符串是不可變的,因此其值不能被更改。否則,任何***都可以篡改其引用的值,這會導致應用程序中的安全問題。

由於 String 是不可變的,因此它對與多線程處理來說是安全的,並且可以在不同的線程之間共享單個 String 實例。這避免了爲線程安全使用同步;字符串是隱式線程安全的。

字符串被用在 Java 類加載器中,其不可變性爲類加載器加載正確的類提供了安全性。否則的話,請考慮這樣一個危險的情況,在你嘗試加載java.sql.Connection 類時,你引用的值卻被更改爲myhacked.Connection,並且它能對數據庫執行你不需要的操作。

由於 String 是不可變的,因此在它被創建時其散列碼就被緩存,不需要再次計算。這使得它成爲映射中鍵的理想對象,它的處理速度比其他HashMap 鍵類型快。這就是爲什麼 String 是HashMap 中最常用的鍵類型。

爲什麼 Java 中的字符串不可變?點擊這裏瞭解更多。

  1. final,finally,和 finalize 三者之間有什麼不同?

這是我最喜歡的問題。

final 關鍵字用於在多個語境下定義只能分配一次的實體。

finally 代碼塊是用於執行重要代碼 (如關閉連接、流等) 的代碼塊。無論是否處理異常,finally 代碼塊總會被執行。finally 代碼塊緊隨try 代碼塊或catch 代碼塊。

這是在刪除或銷燬對象之前垃圾回收器總會調用的方法,該方法使得垃圾回收機制能夠執行清理活動。

  1. 什麼是菱形繼承問題?

菱形繼承問題反映了爲什麼在 Java 中我們不被允許實現多繼承。如果有兩個類共同繼承一個有特定方法的超類,那麼該方法會被兩個子類重寫。然後,如果你決定同時繼承這兩個子類,那麼在你調用該重寫方法時,編譯器不能識別你要調用哪個子類的方法。

你錯過就虧了的十個 Java 面試題?你Get了嗎?
我們把這個問題稱爲菱形繼承問題。上圖對它作了說明,它也得名於此。

  1. 如何使一個類不可變?

我認爲這是一個相當困難的問題。您需要對類進行多次修改,以實現不可變性:

將類聲明爲final,使其無法被繼承。

所有域都用private 修飾,不允許直接訪問。

不提供變量的setter 方法。

所有可變域都用final 修飾, 使它的值只能分配一次。

通過構造函數執行深克隆初始化所有域。

對getter 方法獲取的對象執行克隆以返回副本,而不是返回實際的對象引用。

  1. 什麼是單例模式?

單例模式是指一個類僅允許創建其自身的一個實例,並提供對該實例的訪問權限。它包含靜態變量,可以容納其自身的唯一和私有實例。它被應用於這種場景——用戶希望類的實例被約束爲一個對象。在需要單個對象來協調整個系統時,它會很有幫助。

  1. 什麼是依賴注入?

這是你必須知道的首要問題, 無論你是使用 Java EE 還是 Spring 框架。你可以看看我的文章,其中進一步地解釋了這一點:什麼是依賴注入?
經常被問到的十個 Java 面試題?你Get了嗎?
歡迎工作一到五年的Java工程師朋友們加入java/大數據羣:714526711
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章