常被問到的十個 Java 面試題

在這篇文章中,我試圖收錄最有趣和最多見的問題。此外,我將爲您提供正確的答案。html

接下來,就讓咱們來看看這些問題。java

1. 以滿分十分來評估本身——你有多擅長 Java?面試

若是你並不徹底確信你本身或是你對 Java 的熟練程度,那麼這會是一個很是棘手的問題。若是有這種狀況,你應該把打分調低一點。以後,你大概會獲得與你認可的水平相符的問題。所以,假如你給本身滿分,卻不能回答一個有點難的問題,那將會對你不利。sql

2. 闡述 Java 7 和 Java 8 的區別。數據庫

實話說,二者有不少不一樣。若是你能列出最重要的,應該就足夠了。你應該解釋 Java 8 中的新功能。想要得到完整清單,請訪問官網: Java 8 JDK 。編程

你應該知道如下幾個重點:緩存

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

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

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

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

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

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

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

ArrayListLinkedListHashMapHashSet

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

最好的方法是儘量多地瞭解這些集合類型,由於這類問題幾乎是無窮盡的。

4. 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  方法都在同步程序中獨立運行線程的活動方面發揮了做用,這將在後面的課程中討論,在此不作介紹。其中有五種方法:

publicfinalvoidnotify()publicfinalvoidnotifyAll()publicfinalvoidwait()publicfinalvoidwait(longtimeout)publicfinalvoidwait(longtimeout,intnanos)

5. 爲何 String 對象是不可變的?

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

若是字符串不是不可變的,那麼它可能會對應用程序形成嚴重的安全威脅。例如,數據庫用戶名和密碼都做爲 String 傳遞以獲取數據庫鏈接, Socket 編程 的主機和端口信息也是如此。因爲字符串是不可變的,所以其值不能被更改。不然,任何黑客均可以篡改其引用的值,這會致使應用程序中的安全問題。

因爲 String 是不可變的,所以它對與 多線程處理 來講是安全的,而且能夠在不一樣的線程之間共享單個 String 實例。這避免了爲線程安全使用同步;字符串是隱式線程安全的。

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

因爲 String 是不可變的,所以在它被建立時其散列碼就被緩存,不須要再次計算。這使得它成爲映射中鍵的理想對象,它的處理速度比其餘 HashMap  鍵類型快。這就是爲何 String 是  HashMap  中最經常使用的鍵類型。

6. final,finally,和 finalize 三者之間有什麼不一樣?

這是我最喜歡的問題。

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

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

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

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

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


 

咱們把這個問題稱爲 菱形繼承問題 。上圖對它做了說明,它也得名於此。

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

我認爲這是一個至關困難的問題。您須要對類進行屢次修改,以實現不可變性:

finalprivatesetterfinalgetter

9. 什麼是單例模式?

單例模式是指一個類僅容許建立其自身的一個實例,並提供對該實例的訪問權限。它包含靜態變量,能夠容納其自身的惟一和私有實例。它被應用於這種場景——用戶但願類的實例被約束爲一個對象。在須要單個對象來協調整個系統時,它會頗有幫助。

10. 什麼是依賴注入?

這是你必須知道的首要問題, 不管你是使用 Java EE 仍是 Spring 框架。

總結

在本文中,咱們討論了最多見的十個 面試題 ——在我看來這是根據個人經驗總結出的時下最重要的問題。若是你瞭解這些問題,我相信你能在面試中得到很大的優點。

相關文章
相關標籤/搜索