這 32 道題目涵蓋 Java 基礎語法、集合框架、多執行緒、JVM 機制、設計模式等核心領域,著重考驗對語言細節的深度理解與避坑指南。每題附帶標準答案與深度解析。
try-catch 後必執行(除非 System.exit()),用於資源釋放Object 方法,GC 回收前調用。已淘汰(Java 9 Deprecated),不可靠,請用 try-with-resources 或 Cleaner可 繼承一個類 或 實作一個介面,不可同時做兩者。本質是編譯器產生的隱含類別。
| 特性 | Static Nested Class | Inner Class (非靜態) |
|---|---|---|
| 外部類引用 | 無 | 持有隱含引用 (OuterClass.this) |
| 存取外部成員 | 僅 static 成員 | 所有成員(含私有) |
| 建立實例 | new Outer.Nested() | outer.new Inner() |
| 序列化風險 | 低 | 高(隱含序列化外部類) |
&:位元運算 或 邏輯運算但不短路(兩邊都執行)&&:短路邏輯運算,左邊為 false 時右邊不執行| 特性 | HashMap | Hashtable |
|---|---|---|
| 同步化 | 非同步(高效能) | 同步(低效能) |
| Null Key/Value | 允許一個 null key、多個 null value | 完全不允許 null |
| 繼承體系 | 實作 Map | 繼承 Dictionary(舊 API) |
| 迭代器 | fail-fast | enumerator 不保證 |
現代替代:多執行緒環境用 ConcurrentHashMap 或 Collections.synchronizedMap()
Collection:介面,List/Set/Queue 父介面Collections:工具類,提供排序、搜尋、同步包裝等 static 方法java -ea 或 -enableassertionsSystem.gc()、Runtime.getRuntime().gc()(非強制)new String("xyz") 建立幾個物件?兩個:字串常量池中的 "xyz" + 堆上新建的 String 物件。若常量池已存在則只建一個堆物件。
Math.round(11.5) == 12Math.round(-11.5) == -11(往正無窮大方向捨入,非對稱)
short s = 1;
s = s + 1; // 錯誤:s+1 是 int,需強制轉型 (short)(s+1)
s += 1; // 正確:複合指派運算子隱含轉型
| 特性 | sleep() | wait() |
|---|---|---|
| 所屬類別 | Thread | Object |
| 鎖狀態 | 不釋放鎖 | 釋放鎖,進入等待集合 |
| 喚醒方式 | 時間到/中斷 | notify()/notifyAll()/中斷 |
| 呼叫前提 | 無 | 必須持有物件鎖(在 synchronized 內) |
goto 是保留字但未實作。可用 break/continue 標籤 替代多層迴跳脫。
length 屬性(非方法)length() 方法size() 方法| 特性 | Overload (多載) | Override (覆寫) |
|---|---|---|
| 發生範圍 | 同一類別 | 父子類別 |
| 方法簽名 | 參數列不同 | 完全相同 |
| 回傳型別 | 可不同 | 必須相容(共變) |
| 拋出異常 | 無限制 | 不可比父類更寬泛 |
| 多型類型 | 靜態(編譯期) | 動態(執行期) |
hashCode() 快速分桶,再呼叫 equals() 精確比對a.equals(b) == true ⇒ a.hashCode() == b.hashCode()HashSet、HashMap 失效(找不到物件、重複存入)NullPointerException、IndexOutOfBoundsException、IllegalArgumentException、ClassCastException、ConcurrentModificationException、ArithmeticException
OutOfMemoryError, StackOverflowError),應用不應捕獲處理List ✓ 繼承 CollectionSet ✓ 繼承 CollectionMap ✗ 不繼承 Collection(鍵值對結構不同)| 特性 | Abstract Class | Interface (Java 8+) |
|---|---|---|
| 方法實作 | 可有具體方法 | default/static/private 方法可有實作 |
| 欄位 | 任意 | 僅 static final 常數 |
| 建構子 | 有 | 無 |
| 多重實作 | 單一繼承 | 多重實作 |
| 設計意圖 | 「是一種」關係、共享程式碼 | 「能做什麼」契約、能力擴展 |
static(靜態屬類別、抽象屬實例)native(native 表有實作、抽象表無實作)synchronized(同步是實作細節,抽象方法無本體)interface A extends B, C)abstract class A implements B)start():建立新執行緒,JVM 排程執行 run()run():單純方法呼叫,在當前執行緒同步執行,無多執行緒效果不可**。建構子不屬於繼承成員,但可 Overload(多載)。子類建構子必須呼叫 super() 或 this()。
不可。String 為 final 類別。設計原因:不可變性、字串常量池、安全性(網路/檔案路徑)、效能優化。
同一物件 的所有 synchronized 方法共用同一把鎖(this)。一個執行緒進入任一同步方法,其他執行緒無法進入該物件任何同步方法(但可進入非同步方法)。
會執行,且在 return 前 執行。finally 可修改回傳值(慎用),System.exit() 除外。
2 << 3(左移 3 位 = 乘 2³)。位元運算比乘法指令快,現代 JIT 編譯器會自動優化,人工微優化通常無必要。
違反契約。equals() 回傳 true 時,hashCode() 必須相同。反之不一定(允許碰撞)。
Java 唯有值傳遞。物件參數傳的是引用的副本。方法內可修改物件內容,但無法改變呼叫端的引用指向。
| 版本 | 支援型別 |
|---|---|
| Java 1.0-1.4 | int, short, char, byte |
| Java 5 | + enum |
| Java 7 | + String |
| Java 12+ | + switch 表達式 (yield) |
| Java 17+ | + Pattern Matching (case Type var) |
long/float/double/boolean 不支援
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return INSTANCE; }
}
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; }
}
public enum Singleton {
INSTANCE;
public void doSomething() {}
}
這 32 題涵蓋 Java 核心知識體系的關鍵節點。面試時除背誦答案外,更應理解設計權衡(如效能 vs 安全、繼承 vs 組合)、版本演進(Java 8/11/17 新特性)與實戰最佳實務(如避免 finalize、偏好 Enum Singleton、善用 java.time 替代 Date)。