前言
本文系統梳理 Java 面試高頻核心知識點,涵蓋面向對象、異常、數據類型、IO、集合、多線程、反射、GC、類加載等十大模塊,旨在為開發者構建完整知識體系,助力面試與技術進階。
1. 面向對象四大特性
- 封裝、繼承、多態、抽象
- 多態實現機制:繼承 + 重寫、接口 + 實現
2. 異常體系
分類
- 編譯時異常:需顯式處理(try-catch / throws),如 IOException
- 運行時異常:系統自動處理,可選捕獲,如 NullPointerException
處理策略
- 知曉如何處理 → try-catch
- 不知如何處理 → throws 向上拋出
- 運行時異常一般不顯式處理,交給默認處理器
3. 數據類型
| 類型 | 大小 | 默認值 |
| byte | 1 字節 | 0 |
| char | 2 字節 | '\u0000' |
| short | 2 字節 | 0 |
| int | 4 字節 | 0 |
| float | 4 字節 | 0.0f |
| double | 8 字節 | 0.0 |
| long | 8 字節 | 0L |
| boolean | 1 字節 | false |
String:引用類型,底層 char[],final 類不可繼承
4. IO 體系
- 字節流:InputStream/OutputStream
- 字符流:Reader/Writer(InputStreamReader/OutputStreamWriter 為轉換橋樑)
- 轉換:
InputStreamReader(is)、OutputStreamWriter(os)
5. 集合框架
線程安全性
| 集合 | 線程安全 | 同步包裝 |
| ArrayList/HashSet/HashMap | 不安全 | Collections.synchronizedXxx() |
| Vector/Hashtable | 安全(同步鎖) | 性能差,已過時 |
| ConcurrentHashMap 等 | 高併發安全 | java.util.concurrent 包 |
ConcurrentHashMap 核心原理 (JDK 7/8 差異大,此處綜述)
- 分段鎖(Segment 繼承 ReentrantLock)+ HashEntry 數組 + 鏈表/紅黑樹
- 默認 16 段,理論支持 16 線程並發寫無阻塞
- 讀操作無鎖:volatile 保證可見性,HashEntry 字段 final 保證鏈表不變
- 擴容時只鎖定當前段,不鎖全表
6. 多線程
創建方式
- 繼承 Thread 類
- 實現 Runnable 接口(推薦,解耦任務與執行)
wait vs sleep
| 特性 | wait() | sleep() |
| 所屬類 | Object | Thread |
| 釋放鎖 | 是 | 否 |
| 用途 | 線程通信 | 暫停執行 |
| 喚醒 | notify/notifyAll | 時間到/中斷 |
volatile vs synchronized
| 維度 | volatile | synchronized |
| 作用級別 | 變量 | 變量/方法/類 |
| 可見性 | ✅ | ✅ |
| 原子性 | ❌ | ✅ |
| 阻塞 | 不阻塞 | 可能阻塞 |
| 指令重排 | 禁止 | 禁止 |
| 編譯器優化 | 禁止 | 允許 |
線程池 (Executor 框架)
- 核心優勢:降低創建銷毀開銷、提升響應速度、統一管理監控
- 四大工廠方法:
newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor
- 執行流程:corePoolSize → 隊列 → maximumPoolSize → 拒絕策略
- 線程回收:keepAliveTime 超時且當前線程數 > corePoolSize
Semaphore 限流
Semaphore semaphore = new Semaphore(n); // n 個許可證
semaphore.acquire(); // 獲取許可,阻塞直到可用
try {
// 臨界區代碼
} finally {
semaphore.release(); // 釋放許可
}
7. 反射機制
獲取 Class 對象三種方式
Class.forName("全限定名")
類名.class
對象.getClass()
動態代理
- JDK 動態代理:基於接口,InvocationHandler + Proxy.newProxyInstance()
- CGLIB:基於繼承,字節碼生成子類,無需接口
- 應用:Spring AOP、Hibernate 延遲加載
8. 垃圾回收 (GC)
對象存活判定
- 可達性分析 (GC Roots):棧局部變量、方法區靜態屬性/常量、JNI 引用
- 引用計數法已廢棄(循環引用無法解決)
核心算法
| 算法 | 特點 | 適用代 |
| 標記-清除 | 碎片多,效率低 | 老年代 (DVM) |
| 複製 | 無碎片,內存利用率 50% | 新生代 (98% 朝生夕死) |
| 標記-整理 | 無碎片,適合存活率高 | 老年代 |
| 分代收集 | 新生代複製 + 老年代標記整理 | 現代 JVM 通用 |
JVM 內存結構
- 方法區:類信息、常量、靜態變量
- Java 棧:棧幀、局部變量表、方法調用
- Java 堆:對象實例、數組(GC 主戰場)
四種引用強度
- 強引用:寧願 OOM 不回收
- 軟引用:內存不足時回收,適合緩存
- 弱引用:GC 掃描即回收,生命週期更短
- 虛引用:不決定生命週期,跟蹤被回收狀態,需配合 ReferenceQueue
9. 類加載器
四層結構 (雙親委派)
- 啟動類加載器:C++ 實現,加載
jre/lib 核心庫
- 擴展類加載器:加載
jre/lib/ext
- 應用類加載器:加載
classpath
- 自定義類加載器:繼承 ClassLoader
類初始化觸發條件 (6 種)
- new 實例化
- 讀/寫靜態字段
- 調用靜態方法
- 反射調用
- 初始化子類 (觸發父類)
- JVM 啟動主類
初始化步驟
- 加載鏈接 (未完成時)
- 遞歸初始化父類 (接口除外)
- 執行靜態變量賦值/靜態代碼塊 (按順序)
10. 總結與建議
- 基礎決定上限:集合、多線程、JVM、GC 是高級工程師必修課
- 原理重於 API:知其然更要知其所以然 (如 ConcurrentHashMap 分段鎖、volatile 內存語義)
- 實戰驗證理論:搭建 Demo 驗證 GC 行為、鎖升級、類加載順序
- 關注版本演進:JDK 8→11→17→21 新特性 (模塊化、ZGC、Record、Pattern Matching 等)