1. 程式人生 > >【學習充電】常被問到的十個 Java 面試題

【學習充電】常被問到的十個 Java 面試題

在這篇文章中,最近收錄最有趣和最常見的面試問題。此外,將為您提供正確的答案。
接下來,就讓我們來看看這些問題。

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

  2. 闡述 Java 7 和 Java 8 的區別。
    實話說,兩者有很多不同。如果你能列出最重要的,應該就足夠了。你應該解釋 Java 8 中的新功能。想要獲得完整清單,請訪問官網:Java 8 JDK。
    你應該知道以下幾個重點:
    lambda 表示式,Java 8 版本引入的一個新特性。lambda 表示式允許你將功能當作方法引數或將程式碼當作資料。lambda 表示式還能讓你以更簡潔的方式表示只有一個方法的介面 (稱為函式式介面) 的例項。
    方法引用,為已命名方法提供了易於閱讀的 lambda 表示式。
    預設方法,支援將新功能新增到類庫中的介面,並確保與基於這些介面的舊版本的程式碼的二進位制相容性。
    重複註解,支援在同一宣告或型別上多次應用同一註解型別。
    型別註解,支援在任何使用型別的地方應用註解,而不僅限於宣告。此特性與可插入型系統一起使用時,可增強對程式碼的型別檢查。

  3. 你瞭解哪些集合型別?
    你應該知道以下幾個最重要的型別:
    ArrayList
    LinkedList
    HashMap
    HashSet
    之後,你可能會被問到這樣一些問題,比如何時應該使用此種特定型別,它比其他的好在哪裡,它是怎麼儲存資料的以及隱匿在其後的資料結構是什麼。
    最好的方法是儘可能多地瞭解這些集合型別,因為這類問題幾乎是無窮盡的。

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

  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. 如何使一個類不可變?
小柏認為這是一個相當困難的問題。您需要對類進行多次修改,以實現不可變性:
將類宣告為 final,使其無法被繼承。
所有域都用 private 修飾,不允許直接訪問。
不提供變數的 setter 方法。
所有可變域都用 final 修飾, 使它的值只能分配一次。
通過建構函式執行深克隆初始化所有域。
對 getter 方法獲取的物件執行克隆以返回副本,而不是返回實際的物件引用。

  1. 什麼是單例模式?
    單例模式是指一個類僅允許建立其自身的一個例項,並提供對該例項的訪問許可權。它包含靜態變數,可以容納其自身的唯一和私有例項。它被應用於這種場景——使用者希望類的例項被約束為一個物件。在需要單個物件來協調整個系統時,它會很有幫助。
  2. 什麼是依賴注入?
    這是你必須知道的首要問題, 無論你是使用 Java EE 還是 Spring 框架。你可以看看我的文章,其中進一步地解釋了這一點: 什麼是依賴注入?
    總結
    在本文中,我們討論了最常見的十個 Java 面試題——在我看來這是根據我的經驗總結出的時下最重要的問題。如果你瞭解這些問題,小柏相信你能在面試中獲得很大的優勢。

最後,如果你跟我一樣都喜歡java,想成為一名優秀的程式設計師,也在學習java的道路上奔跑,歡迎你加入java學習群:72030155 群內每天都會分享java最新業內資料,分享java免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!