本文整理了高頻 Java 面試題,涵蓋網絡故障排查、數據庫事務、IO 流體系、序列化、JVM 類加載、內存模型、垃圾回收、斷言、內存洩漏、類加載器隔離、Spring AOP/IOC 原理、Bean 作用域及項目性能優化等核心知識點。
以 SQL Server 為例,演示 BEGIN TRAN、COMMIT TRAN、ROLLBACK TRAN 配合 @@ERROR 實現原子性轉賬:
CREATE PROCEDURE transfer
@fromId INT, @toId INT, @amount MONEY
AS
BEGIN
BEGIN TRAN
UPDATE accounts SET balance -= @amount WHERE id = @fromId;
UPDATE accounts SET balance += @amount WHERE id = @toId;
IF @@ERROR <> 0
ROLLBACK TRAN;
ELSE
COMMIT TRAN;
END
Oracle 差異: 隱式開啟事務,僅需 COMMIT/ROLLBACK。
Serializable 標記接口(無方法)ObjectOutputStream.writeObject() 持久化ObjectInputStream.readObject() 反序列化由 ClassLoader 及其子類負責運行時動態加載 .class 文件,遵循「雙親委派模型」。
| 特性 | Stack (棧) | Heap (堆) |
|---|---|---|
| 分配方式 | 系統自動分配/釋放 | 程序員手動 new 分配,GC 回收 |
| 空間大小 | 較小,固定 | 大,動態擴展 |
| 存儲內容 | 基本類型、對象引用、方法幀 | 對象實例、數組 |
System.gc() 僅為建議,不保證立即執行-ea 啟用AssertionError長生命周期對象持有短生命周期對象引用(如靜態集合未清理、監聽器未註銷),導致 GC 無法回收。
技術上可行,但需自定義類加載器打破雙親委派;否則 Bootstrap ClassLoader 始終加載 JRE 核心庫中的 String。
依賴注入(DI)由容器管理 Bean 生命周期及依賴關係,實現解耦。配置方式:XML、注解、JavaConfig。
singleton(默認):容器內單例prototype:每次獲取創建新實例request/session/globalSession:Web 環境專用base-package)default-lazy-init="true"