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

Java 核心易混淆知識點大全:32 道經典面試題深度解析

     編輯:Java 相關知識

Java 基礎高頻易混點總覽

Java 語言細節豐富,許多語法與概念極易混淆,也是面試與日常開發中的「坑」。本文整理 32 道經典題目,涵蓋關鍵字、集合、多執行緒、記憶體模型、語法細節等核心領域,附帶深度解析與最佳實務,助你建立精確的心智模型。

關鍵字與修飾符

1. final / finally / finalize

  • final:修飾類(不可繼承)、方法(不可覆寫)、變數(不可重新指派,基本型別值不變、參考型別引用不變)
  • finally:try-catch 區塊的收尾區塊,無論是否拋出例外皆執行(除非 JVM 退出),常用於資源釋放
  • finalize():Object 方法,GC 回收前呼叫,已淘汰(Java 9 標記棄用),請改用 Cleaner 或 try-with-resources

2. 匿名內部類限制

  • 可實作單一介面 或 繼承單一類別,不可同時做兩者
  • 無法顯式宣告建構子,可使用實例初始化區塊 `{}`

3. Static Nested Class vs Inner Class

特性Static Nested ClassInner Class (非靜態)
外部類實例不需要需要
存取外部成員僅 static 成員所有成員(含私有)
常見用途工具類、Builder 模式事件監聽、迭代器實作

4. & vs &&

  • &:位元運算 或 邏輯運算(不短路,兩邊皆運算)
  • &&:短路邏輯與,左側為 false 時右側不執行

集合框架

5. HashMap vs Hashtable

特性HashMapHashtable
同步非同步(高效能)同步(低效能,已淘汰)
Null Key/Value允許一個 null key、多個 null value不允許
繼承體系Map 介面實作Dictionary 抽象類別子類
迭代器fail-fastenumerator + fail-fast

現代替代:多執行緒環境請用 ConcurrentHashMap(分段鎖/CAS,高並發)或 Collections.synchronizedMap()。

6. Collection vs Collections

  • Collection:根介面(List、Set、Queue 父介面)
  • Collections:工具類(靜態方法:排序、搜尋、同步包裝、不可變視圖等)

16. Set 判重依據

  • 依賴 equals() 與 hashCode() 契約:equals() 回傳 true 的兩物件,hashCode() 必須相等
  • == 比較參考位址;equals() 比較邏輯相等(須覆寫)

19. List/Set/Map 與 Collection 關係

  • List、Set 繼承 Collection
  • Map 不繼承 Collection(鍵值對結構不同)

物件導向與語法細節

7. assert 斷言

  • 僅用於除錯/測試,不可改變程式狀態
  • 預設關閉,需 -ea 或 -enableassertions 啟用
  • 不可用於 public 方法參數驗證(生產環境可能關閉)

8. GC 基礎

  • 可建議執行:System.gc() 或 Runtime.getRuntime().gc(),但不保證立即執行
  • 現代 GC(G1、ZGC、Shenandoah)為分代、並發、低延遲設計

9. String 建構子建立物件數

String s = new String("xyz"); // 兩個物件:字串常量池 "xyz" + 堆上新 String 物件

10. Math.round 負數規則

  • Math.round(11.5) == 12
  • Math.round(-11.5) == -11(向正無窮大方向捨入,即 floor(x + 0.5))

11. short 運算隱含轉型

short s1 = 1; s1 = s1 + 1; // 編譯錯誤:s1+1 為 int,需強轉 (short)
short s1 = 1; s1 += 1;     // 正確:複合指派隱含強轉

12. sleep() vs wait()

特性sleep()wait()
所屬類別ThreadObject
鎖釋放不釋放釋放同步鎖
喚醒方式時間到 / interrupt()notify()/notifyAll() / interrupt()
呼叫前提無必須持有物件監視器鎖(在 synchronized 區塊中)

13. goto 保留字

Java 保留 goto 但未實作,使用標籤配合 break/continue 實現類似功能。

14. length vs length()

  • 陣列:.length(屬性)
  • String/集合:.length() / .size()(方法)

15. Overload vs Override

特性Overload(多載)Override(覆寫)
範圍同一類別父子類別
方法簽章參數列表不同完全相同(含回傳型別協變)
回傳型別可不同相同或子類別(協變)
拋出例外無限制不可拋出更廣的受檢例外

17. 常見 RuntimeException

NullPointerException、IndexOutOfBoundsException、IllegalArgumentException、ClassCastException、ConcurrentModificationException 等。

18. Error vs Exception

  • Error:系統級嚴重問題(OOM、StackOverflow),應用無法恢復
  • Exception:應用層邏輯錯誤,可捕獲處理

20. Abstract Class vs Interface

特性Abstract ClassInterface (Java 8+)
方法實作可有實作方法default/static/private 方法可有實作
建構子有(子類建構時隱式呼叫)無
成員變數任意僅 static final 常數
多重實作單一繼承多重實作

21. abstract 方法限制

不可同時為 static、native、synchronized(隱含實作細節與抽象語意衝突)。

22. 介面繼承與類別關係

  • 介面可繼承多個介面(extends)
  • 抽象類別可實作介面(implements)
  • 抽象類別可繼承具體類別(需有可見建構子)

23. 執行緒啟動

  • start():建立新執行緒,JVM 呼叫 run()
  • run():普通方法呼叫,不建立新執行緒

24. 建構子不可覆寫

建構子非繼承成員,不可 Override,可 Overload。子類建構子隱式/顯式呼叫 super()。

25. String final 類別

String 為 final,不可繼承,保證不可變性與字串常量池安全。

26. synchronized 方法鎖

實例方法鎖住 this;靜態方法鎖住 Class 物件。同一物件同一時間僅一執行緒可進入其任一實例 synchronized 方法。

27. try-finally-return 執行順序

  • finally 一定執行(除非 JVM 退出)
  • 執行順序:try → finally → return(finally 可修改回傳值,慎用)

28. 位移運算優化

2 * 8 == 2 << 3 // 乘 2^n 等價左移 n 位

29. equals 與 hashCode 契約

錯誤論述:兩物件 equals 為 true 但 hashCode 不同 → 違反契約,導致 HashMap/HashSet 失效。必須同時覆寫兩者。

30. 參數傳遞:值傳遞

Java 唯有值傳遞。物件參數傳的是「參考的副本」,可修改物件內部狀態,無法改變呼叫端的參考指向。

31. switch 支援型別

  • Java 1-6:int、short、char、byte、Character、Byte、Short、Integer、enum
  • Java 7+:新增 String
  • Java 12+:switch 表達式(->、yield)
  • 不支援:long、float、double、boolean

32. Singleton 模式寫法

// 餓漢式(線程安全、類載入即建立)
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return INSTANCE; }
}

// 懶漢式 Double-Check Locking (DCL) - Java 5+ volatile 保證可見性
public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) instance = new Singleton();
            }
        }
        return instance;
    }
}

// 靜態內部類(推薦:線程安全、延遲載入、無鎖)
public class Singleton {
    private Singleton() {}
    private static class Holder { static final Singleton INSTANCE = new Singleton(); }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

總結

掌握這 32 個易混點,不僅能應付面試,更能在日常開發中避免隱性 Bug,寫出更健壯、高效的 Java 程式碼。建議配合原始碼、JLS (Java Language Specification) 及 JVM 規範深入理解底層機制。

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