1. final、finally、finalize 三者區別
- final:修飾符。修飾類→不可繼承;修飾方法→不可覆寫;修飾變量→常量(聲明時賦值,不可改)。
abstract 與 final 互斥。
- finally:異常處理塊。
try-catch 後必執行(除 System.exit()),用於資源釋放。
- finalize():
Object 方法。GC 回收對象前調用,供子類覆寫釋放原生資源。不保證被調用,Java 9+ 已棄用,推薦 try-with-resources 或 Cleaner。
2. 匿名內部類能否 extends / implements?
不能 extends 其他類**,但可 implements 一個介面**(隱式實現)。本質是「繼承一個類或實現一個介面」的語法糖,編譯器生成一個繼承目標類/實現目標介面的匿名子類。
3. Static Nested Class vs Inner Class
| 特性 | Static Nested Class | Inner Class (非靜態) |
| 外部類引用 | 無 | 持有隱式引用 (Outer.this) |
| 創建實例 | new Outer.Nested() | outer.new Inner() |
| 訪問外部成員 | 僅 static 成員 | 所有成員(含私有) |
| C++ 對應 | Nested Class | 無直接對應(C++ 無隱式 this 指針) |
關鍵差異在於是否持有外部實例引用,影響記憶體佔用與序列化行為。
4. & vs &&
&:位運算符(按位與),不短路,兩邊必評估
&&:邏輯與,短路,左邊 false 時右邊不執行
5. HashMap vs Hashtable
| 特性 | HashMap | Hashtable |
| 同步性 | 非線程安全 | 同步(synchronized) |
| Null 鍵/值 | 允許 1 個 null key、多個 null value | 不允許 |
| 效能 | 高 | 低(鎖開銷) |
| 繼承 | Map | Dictionary → Map |
現代開發推薦 HashMap + 外部同步或 ConcurrentHashMap。
6. Collection vs Collections
- Collection:頂層介面(
List、Set、Queue 父介面)
- Collections:工具類(
sort、binarySearch、synchronizedList、unmodifiableList 等 static 方法)
7. assert 斷言使用指南
語法:assert 條件 或 assert 條件 : 詳細訊息。預設關閉,啟用需 -ea 或 -enableassertions。
適用場景:
- 私有方法前置條件檢查
- 代碼邏輯「理論上不可達」處(如
default: assert false)
- 後置條件驗證
禁用場景:公共方法參數檢查(必須拋異常)、改變程序狀態的表達式。
8. GC (Garbage Collector) 基礎
- 自動內存管理,開發者無需手動
free/delete
- 可請求 GC:
System.gc() 或 Runtime.getRuntime().gc()(非強制)
- 現代 JVM 採用分代收集(新生代/老年代)、G1、ZGC 等演算法
9. String s = new String("xyz") 創建幾個對象?
兩個:
- 字串常量池中的
"xyz"(若不存在則創建)
- 堆上新建的
String 實例 s,內容複製自常量池
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)(s1+1)
s1 += 1; // 正確:複合賦值隱含強轉
12. sleep() vs wait()