引言
Java 作為全球最流行的編程語言之一,其面試題不僅考察候選人的編程能力,更關注對底層原理和架構設計的理解。本文將系統梳理 Java 面試中的高頻考點,結合代碼示例與原理分析,助您從容應對技術面試。
一、Java 基礎語法與核心特性
1. String、StringBuilder 與 StringBuffer 的區別
- String:不可變對象,每次修改都會生成新對象,適合少量字符串操作。
- StringBuilder:可變字符序列,線程不安全,性能高,適合單線程環境。
- StringBuffer:可變字符序列,線程安全(通過
synchronized
修飾方法),適合多線程環境。
示例代碼:
java
String str = "hello";
str += "world"; // 生成新對象"helloworld"StringBuilder sb = new StringBuilder();
sb.append("hello").append("world"); // 直接修改原對象
2. 異常處理機制
- 受檢異常(Checked Exception):必須顯式捕獲或拋出(如
IOException
)。 - 非受檢異常(Unchecked Exception):無需顯式處理(如
NullPointerException
)。 - 最佳實踐:用
finally
釋放資源,優先捕獲具體異常而非Exception
。
二、面向對象與設計模式
3. 多態的實現方式
- 重載(Overloading):編譯時多態,通過參數列表區分。
- 重寫(Overriding):運行時多態,基于動態綁定。
示例:
java
class Animal {public void sound() { System.out.println("Animal makes sound"); }
}class Dog extends Animal {@Overridepublic void sound() { System.out.println("Woof!"); }
}
4. 單例模式的線程安全實現
雙重檢查鎖定(DCL):
java
public class Singleton {private static volatile Singleton instance; // volatile防止指令重排private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
三、多線程與并發編程
5. 線程的創建方式
- 繼承
Thread
類:代碼簡單,但擴展性差。 - 實現
Runnable
接口:推薦方式,支持資源共享。 - 實現
Callable
接口:可返回值并拋出異常。
示例:
java
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<String> future = executor.submit(() -> "Hello from Callable");
6. 鎖機制對比
鎖類型 | 實現方式 | 特性 |
---|---|---|
內置鎖 | synchronized | 可重入、非公平 |
顯式鎖 | ReentrantLock | 可重入、公平性可選 |
讀寫鎖 | ReentrantReadWriteLock | 讀共享、寫獨占 |
四、集合框架與數據結構
7. ArrayList 與 LinkedList 的選擇
- ArrayList:基于數組,隨機訪問快,插入 / 刪除慢。
- LinkedList:基于雙向鏈表,插入 / 刪除快,隨機訪問慢。
應用場景:
- 頻繁查詢 → ArrayList
- 頻繁增刪 → LinkedList
8. HashMap 的底層實現
- JDK 1.7:數組 + 鏈表
- JDK 1.8:數組 + 鏈表 + 紅黑樹(鏈表長度≥8 時轉換為紅黑樹)
- 線程安全:使用
ConcurrentHashMap
或Hashtable
五、JVM 原理與性能優化
9. JVM 內存區域劃分
- 堆(Heap):存儲對象實例,GC 主要區域。
- 方法區(Method Area):存儲類信息、常量等。
- 程序計數器(PC Register):記錄當前線程執行的字節碼指令地址。
10. GC 算法對比
- 標記 - 清除:簡單但易產生碎片。
- 復制算法:無碎片,適合新生代。
- 標記 - 整理:減少碎片,適合老年代。
六、數據庫與 SQL 優化
11. 事務的隔離級別
- 讀未提交(Read Uncommitted):可能出現臟讀。
- 讀已提交(Read Committed):避免臟讀,可能出現不可重復讀。
- 可重復讀(Repeatable Read):默認級別,避免臟讀和不可重復讀。
- 串行化(Serializable):最高級別,完全隔離。
12. SQL 優化策略
- 索引優化:為高頻查詢字段添加索引。
- 分頁優化:使用
LIMIT offset, size
時,通過覆蓋索引減少回表。 - 批量操作:使用
INSERT INTO ... VALUES (...), (...), ...
減少網絡 IO。
七、主流框架與中間件
13. Spring IOC 與 AOP
- IOC(控制反轉):通過依賴注入(DI)解耦組件。
- AOP(面向切面編程):用于日志、事務等橫切關注點。
示例:
java
@Service
public class UserService {@Autowiredprivate UserRepository repository; // 自動注入依賴
}
14. MyBatis 的緩存機制
- 一級緩存:SqlSession 級別的本地緩存。
- 二級緩存:全局緩存,基于
Cache
接口實現。
八、分布式系統設計
15. CAP 定理與 BASE 理論
- CAP:一致性(Consistency)、可用性(Availability)、分區容錯性(Partition Tolerance)。
- BASE:基本可用(Basically Available)、軟狀態(Soft State)、最終一致性(Eventually Consistent)。
16. 服務治理的核心問題
- 服務發現:Eureka、Consul。
- 負載均衡:Ribbon、Nginx。
- 熔斷降級:Hystrix、Sentinel。
結語
Java 面試的核心在于 “知其然,更知其所以然”,建議:
- 結合項目經驗理解知識點
- 深入閱讀源碼(如集合框架、并發包)
- 多做模擬面試(推薦 LeetCode、劍指 Offer)
通過系統梳理與針對性練習,您將在面試中展現扎實的技術功底與架構思維。