Java 語言細節豐富,許多語法與概念極易混淆,也是面試與日常開發中的「坑」。本文整理 32 道經典題目,涵蓋關鍵字、集合、多執行緒、記憶體模型、語法細節等核心領域,附帶深度解析與最佳實務,助你建立精確的心智模型。
Cleaner 或 try-with-resources| 特性 | Static Nested Class | Inner Class (非靜態) |
|---|---|---|
| 外部類實例 | 不需要 | 需要 |
| 存取外部成員 | 僅 static 成員 | 所有成員(含私有) |
| 常見用途 | 工具類、Builder 模式 | 事件監聽、迭代器實作 |
&:位元運算 或 邏輯運算(不短路,兩邊皆運算)&&:短路邏輯與,左側為 false 時右側不執行| 特性 | HashMap | Hashtable |
|---|---|---|
| 同步 | 非同步(高效能) | 同步(低效能,已淘汰) |
| Null Key/Value | 允許一個 null key、多個 null value | 不允許 |
| 繼承體系 | Map 介面實作 | Dictionary 抽象類別子類 |
| 迭代器 | fail-fast | enumerator + fail-fast |
現代替代:多執行緒環境請用 ConcurrentHashMap(分段鎖/CAS,高並發)或 Collections.synchronizedMap()。
Collection:根介面(List、Set、Queue 父介面)Collections:工具類(靜態方法:排序、搜尋、同步包裝、不可變視圖等)equals() 與 hashCode() 契約:equals() 回傳 true 的兩物件,hashCode() 必須相等== 比較參考位址;equals() 比較邏輯相等(須覆寫)-ea 或 -enableassertions 啟用System.gc() 或 Runtime.getRuntime().gc(),但不保證立即執行String s = new String("xyz"); // 兩個物件:字串常量池 "xyz" + 堆上新 String 物件
Math.round(11.5) == 12Math.round(-11.5) == -11(向正無窮大方向捨入,即 floor(x + 0.5))short s1 = 1; s1 = s1 + 1; // 編譯錯誤:s1+1 為 int,需強轉 (short)
short s1 = 1; s1 += 1; // 正確:複合指派隱含強轉
| 特性 | sleep() | wait() |
|---|---|---|
| 所屬類別 | Thread | Object |
| 鎖釋放 | 不釋放 | 釋放同步鎖 |
| 喚醒方式 | 時間到 / interrupt() | notify()/notifyAll() / interrupt() |
| 呼叫前提 | 無 | 必須持有物件監視器鎖(在 synchronized 區塊中) |
Java 保留 goto 但未實作,使用標籤配合 break/continue 實現類似功能。
.length(屬性).length() / .size()(方法)| 特性 | Overload(多載) | Override(覆寫) |
|---|---|---|
| 範圍 | 同一類別 | 父子類別 |
| 方法簽章 | 參數列表不同 | 完全相同(含回傳型別協變) |
| 回傳型別 | 可不同 | 相同或子類別(協變) |
| 拋出例外 | 無限制 | 不可拋出更廣的受檢例外 |
NullPointerException、IndexOutOfBoundsException、IllegalArgumentException、ClassCastException、ConcurrentModificationException 等。
| 特性 | Abstract Class | Interface (Java 8+) |
|---|---|---|
| 方法實作 | 可有實作方法 | default/static/private 方法可有實作 |
| 建構子 | 有(子類建構時隱式呼叫) | 無 |
| 成員變數 | 任意 | 僅 static final 常數 |
| 多重實作 | 單一繼承 | 多重實作 |
不可同時為 static、native、synchronized(隱含實作細節與抽象語意衝突)。
extends)implements)start():建立新執行緒,JVM 呼叫 run()run():普通方法呼叫,不建立新執行緒建構子非繼承成員,不可 Override,可 Overload。子類建構子隱式/顯式呼叫 super()。
String 為 final,不可繼承,保證不可變性與字串常量池安全。
實例方法鎖住 this;靜態方法鎖住 Class 物件。同一物件同一時間僅一執行緒可進入其任一實例 synchronized 方法。
finally 一定執行(除非 JVM 退出)2 * 8 == 2 << 3 // 乘 2^n 等價左移 n 位
錯誤論述:兩物件 equals 為 true 但 hashCode 不同 → 違反契約,導致 HashMap/HashSet 失效。必須同時覆寫兩者。
Java 唯有值傳遞。物件參數傳的是「參考的副本」,可修改物件內部狀態,無法改變呼叫端的參考指向。
->、yield)// 餓漢式(線程安全、類載入即建立)
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 規範深入理解底層機制。