首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 面試精選:網絡、事務、IO、JVM、GC 及 Spring 核心原理

     編輯:Java 綜合教學

Java 面試精選:網絡、事務、IO、JVM、GC 及 Spring 核心原理

本文整理了高頻 Java 面試題,涵蓋網絡故障排查、數據庫事務、IO 流體系、序列化、JVM 類加載、內存模型、垃圾回收、斷言、內存洩漏、類加載器隔離、Spring AOP/IOC 原理、Bean 作用域及項目性能優化等核心知識點。

1. 同網段電腦無法訪問共享文件排查思路

  1. 確認是否在同一工作組
  2. 檢查防火牆/殺毒軟件攔截
  3. 驗證文件夾確已正確共享並設置權限

2. 數據庫事務 Demo:轉賬操作

以 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。

3. 字節流 vs 字符流

  • 字節流:直接操作文件,無緩衝,處理所有二進制數據(圖片、視頻等)
  • 字符流:基於緩衝區,專門處理文本,自動處理編碼轉換

4. Java 序列化與 Serializable

  • 實現 Serializable 標記接口(無方法)
  • 用 ObjectOutputStream.writeObject() 持久化
  • 用 ObjectInputStream.readObject() 反序列化
  • 作用:標識對象可被序列化,實現對象狀態的保存與傳輸

5. JVM 類加載機制

由 ClassLoader 及其子類負責運行時動態加載 .class 文件,遵循「雙親委派模型」。

6. Heap vs Stack

特性Stack (棧)Heap (堆)
分配方式系統自動分配/釋放程序員手動 new 分配,GC 回收
空間大小較小,固定大,動態擴展
存儲內容基本類型、對象引用、方法幀對象實例、數組

7. GC (垃圾回收) 核心概念

  • 定義:自動監測並回收無引用對象內存
  • 優勢:消除手動內存管理,防止內存洩漏
  • 原理:有向圖可達性分析,單獨低優先級線程運行
  • 常見算法:分代複製、標記清除/整理、增量收集

8. GC 觸發與干預

  • 對象創建時 GC 開始監控
  • System.gc() 僅為建議,不保證立即執行

9. assert 斷言用法

  • 調試階段驗證假設條件
  • 默認關閉,需 -ea 啟用
  • 失敗拋出 AssertionError

10. Java 內存洩漏示例

長生命周期對象持有短生命周期對象引用(如靜態集合未清理、監聽器未註銷),導致 GC 無法回收。

11. 自定義 java.lang.String 類

技術上可行,但需自定義類加載器打破雙親委派;否則 Bootstrap ClassLoader 始終加載 JRE 核心庫中的 String。

12. Spring AOP 原理

  • 基於 IOC 容器,動態代理(JDK Proxy / CGLIB)
  • 將橫切關注點(事務、日志、安全)與業務邏輯分離

13. Spring IOC 實現

依賴注入(DI)由容器管理 Bean 生命周期及依賴關係,實現解耦。配置方式:XML、注解、JavaConfig。

14. Bean 作用域

  • singleton(默認):容器內單例
  • prototype:每次獲取創建新實例
  • request/session/globalSession:Web 環境專用

15. Spring 項目啟動慢優化策略

  1. 縮小掃描路徑(精確 base-package)
  2. 啟用延遲加載 default-lazy-init="true"
  3. 移除無用 Bean 定義
  4. 模塊化拆分,按需加載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved