首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 面試必考:十大經典核心題目深度解析與避坑指南

     編輯:Java 程式設計入門

前言

Java 核心基礎是面試的「硬骨頭」,也是區分初中高級工程師的關鍵分水嶺。本文精選 10 道高頻經典題目,不僅給出標準答案,更深入剖析 底層原理、常見誤區、實戰陷阱,助你在面試中展現技術深度。


第 1 題:final、finally、finalize 三者區別

標準答案

關鍵字類型核心作用關鍵點
final修飾符不可變/不可繼承/不可覆寫修飾類不可繼承、修飾方法不可覆寫、修飾變量引用不可變 (對象內容仍可修改)、編譯期常量優化
finally程式碼塊異常處理的清理保證配合 try-catch,無論是否拋出異常皆執行 (除非 JVM 退出/線程死亡),用於釋放資源 (關流、解鎖)
finalize()Object 方法GC 前的最後掙扎已棄用 (Java 9),不可靠、效能差、無法保證執行時間/順序,替代方案:try-with-resources / Cleaner / PhantomReference

加分點:final 變量的記憶體語義

// 編譯期常量 (基本類型/String) 會進入常量池,調用處直接內聯
static final int CONST = 100; 

// 引用類型 final:引用不可變,但對象內容可變
final List list = new ArrayList<>();
list.add("ok");      // 合法
// list = new ArrayList<>(); // 編譯錯誤

第 2 題:HashMap vs Hashtable 核心差異

核心對比

維度HashMap (JDK 1.2+)Hashtable (JDK 1.0)
同步性非線程安全 (高效)所有方法 synchronized (低效)
Null 支援允許 1 個 null key、多個 null value完全不允許 null
繼承體系Map 介面Dictionary 抽象類 (舊)
迭代器fail-fastenumerator (非 fail-fast)
初始容量/擴容16 / 2倍 (力為2的冪次)11 / 2n+1
現代替代單執行緒首選已淘汰,多執行緒用 ConcurrentHashMap

面試必追問:JDK 1.8 HashMap 擴容機制與紅黑樹轉換閾值

  • 鏈表長度 ≥ 8 且陣列長度 ≥ 64 → 鏈表轉紅黑樹 (TreeNode)。
  • 紅黑樹節點 ≤ 6 → 退化為鏈表。
  • 擴容時 `e.hash & oldCap == 0` 判斷元素留在原索引還是遷移到 `index + oldCap`,避免重新計算 hash。

第 3 題:String s = new String("xyz") 創建幾個對象?

答案:2 個 (或 1 個)

  1. 堆中對象:`new String()` 在堆上創建新對象。
  2. 常量池對象:字面量 `"xyz"` 在編譯期進入字串常量池 (若已存在則複用)。

關鍵補充:若常量池已有 `"xyz"` (如之前代碼用過),則僅創建 1 個堆對象。面試可畫圖說明:字串常量池 (JDK 7 移至堆) vs 堆對象。


第 4 題:sleep() vs wait() 核心區別

維度Thread.sleep()Object.wait()
所屬類Thread (靜態方法)Object (實例方法)
鎖行為不釋放鎖 (持有 synchronized 鎖睡覺)釋放鎖,進入等待隊列
喚醒方式時間到自動喚醒 / interrupt()notify()/notifyAll() / interrupt() / 時間到
調用前提無必須在 synchronized 同步塊/方法中
典型場景定時輪詢、延遲重試生產者消費者、線程協作
陷阱提醒:`sleep(0)` 會觸發上下文切換,讓出 CPU 時間片;`wait(0)` 表示無限等待直到被喚醒。

第 5 題:short s1 = 1; s1 = s1 + 1 vs s1 += 1

答案

  • s1 = s1 + 1:編譯錯誤。`s1 + 1` 整型提升為 `int`,無法隱式賦值給 `short`,需強轉 `(short)(s1 + 1)`。
  • s1 += 1:正確。複合賦值運算符隱含強轉:`s1 = (short)(s1 + 1)` (JLS 規範)。

第 6 題:Overload (重載) vs Override (重寫) 差異

維度Overload (重載)Override (重寫)
發生範圍同一類內父子類之間
方法簽名方法名相同,參數列表不同 (類型/個數/順序)方法名、參數列表、返回類型 (协變) 完全相同
返回類型可不同相同或子類型 (JDK 5+ 協變返回)
拋出異常無限制子類異常 ≤ 父類異常 (里氏替換)
訪問權限無限制子類 ≥ 父類 (不能縮小)
多態類型編譯期靜態綁定運行期動態綁定

面試追問:Overload 能否只改返回類型?

不能。編譯器無法根據返回類型區分呼叫哪個方法。參數列表必須不同。


第 7/10 題:Set 判重依靠 equals() 還是 ==?

題目重複,核心答案一致。

標準答案

  • Set 判重使用 equals() 方法 (配合 hashCode())。
  • == 比較引用地址 (基本類型比值);equals() 比較邏輯內容 (需重寫)。
  • 契約:`a.equals(b) == true` → `a.hashCode() == b.hashCode()` 必須成立。違反會導致 HashSet/HashMap 失效 (找不到元素、重複存入)。

原始碼證據

// HashMap.putVal 判重邏輯 (JDK 1.8)
if (p.hash == hash &&
    ((k = p.key) == key || (key != null && key.equals(k)))) {
    // 找到相同 key,覆蓋 value
    e = p;
}

第 8 題:Error vs Exception 差異

維度Error (錯誤)Exception (異常)
性質JVM 層級嚴重問題,通常不可恢復程式邏輯/運行期可預期問題,可捕獲處理
典型例子OutOfMemoryError, StackOverflowError, NoClassDefFoundErrorNullPointerException, IOException, SQLException, 業務異常
處理策略不應捕獲,只能預防 (調優參數、修代碼)應捕獲處理,或向上拋出由全局處理器統一處理
繼承Throwable → ErrorThrowable → Exception → RuntimeException (非受檢) / 受檢異常

第 9 題:常見 RuntimeException 列舉

面試官通常考察你對「非受檢異常」的熟悉度,而非背誦列表。掌握分類即可:

  • 空指針/類型轉換:`NullPointerException`, `ClassCastException`
  • 數組/集合越界:`IndexOutOfBoundsException`, `ArrayIndexOutOfBoundsException`, `ConcurrentModificationException`
  • 非法參數/狀態:`IllegalArgumentException`, `IllegalStateException`, `UnsupportedOperationException`
  • 數學/運算:`ArithmeticException` (除零)
  • 並發/資源:`IllegalMonitorStateException`, `RejectedExecutionException`
最佳實踐:業務邏輯驗證失敗拋 IllegalArgumentException 或自定義業務異常 (繼承 RuntimeException),避免濫用 NPE。

總結:面試回答的「黃金公式」

  1. 定義結論:一句話給出核心區別。
  2. 對比表格:多維度對比 (語法、語義、性能、適用場景)。
  3. 底層原理:引用源碼、JVM 行為、JLS 規範。
  4. 實戰陷阱:常見 Bug、最佳實踐、版本演進 (如 JDK 9 finalize 棄用)。
  5. 延伸關聯:關聯到集合、併發、JVM、框架原理。

掌握這 10 題的深度解析,Java 基礎關基本通關。建議動手寫 Demo 驗證每個知識點,面試時才能侃侃而談。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved