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

Java 面試高頻 10 道核心題精講:JVM、集合、多線程、反射全覆蓋

     編輯:Java 綜合教學

1. JVM 是什麼?為什麼 Java 跨平台?

JVM (Java Virtual Machine) 是運行 Java 字節碼的虛擬機器。Java 源碼編譯為 .class 字節碼,字節碼在 JVM 上運行。跨平台本質:不同操作系統有對應的 JVM 實現 (Windows/Linux/macOS/嵌入式),屏蔽了底層指令集、內存模型、系統調用差異,實現「一次編譯,到處運行」。

2. JDK、JRE、JVM 三者關係?

  • JVM:運行字節碼的核心虛擬機 (HotSpot、OpenJ9、GraalVM)。
  • JRE (Java Runtime Environment) = JVM + 核心類庫 (rt.jar/modules) + 啟動器。運行 Java 程序的最小環境。
  • JDK (Java Development Kit) = JRE + 開發工具 (javac, javadoc, jdb, jconsole, jar 等)。開發、編譯、調試、打包的完整工具包。

JDK 9+ 模組化後,rt.jar 拆分為 jmods 目錄下的模塊,JRE 也可通過 jlink 定制裁剪。

3. Java 面向對象三大特性 (封裝、繼承、多態) + 抽象

特性核心含義Java 實現機制
封裝隱藏內部細節,暴露公共接口private/protected/public 訪問修飾符、Getter/Setter
繼承子類復用父類代碼,建立 is-a 關係extends、super、方法重寫 @Override
多態同一接口不同實現,運行期動態綁定向上轉型、動態分派 (invokevirtual)、接口多實現
抽象提取共性忽略細節,定義契約abstract class、interface (JDK 8+ default/static/private 方法)

4. 靜態方法能訪問非靜態變量嗎?

不能。靜態方法屬於類,類加載時初始化;非靜態變量屬於實例,對象創建時才存在。靜態上下文無 this 引用,編譯器直接報錯 non-static variable cannot be referenced from a static context。

5. Override (重寫) vs Overload (重載) 區別?

維度Override (重寫)Overload (重載)
發生位置父子類/接口實現類同一類內部
方法簽名名稱、參數列表、返回類型 完全相同名稱相同,參數列表 不同 (類型/個數/順序)
返回類型可协變 (子類類型)無要求
訪問權限不能降低 (public > protected > default > private)無要求
拋出異常不能拋出更寬泛的檢查型異常無要求
綁定時機運行期動態綁定編譯期靜態綁定

6. Java 支持多繼承嗎?

類不支持多繼承 (單繼承),但 接口支持多實現 (implements A, B, C)。JDK 8+ 接口引入 default 方法後,間接實現了「行為多繼承」,鑽石問題由編譯器強制要求實現類顯式覆蓋衝突的 default 方法解決。

7. 進程 vs 線程 區別?

  • 進程:資源分配基本單位,擁有獨立內存空間 (代碼段、數據段、堆、棧)、文件描述符、PID。進程間通信 (IPC) 開銷大 (管道、Socket、共享內存)。
  • 線程:CPU 調度基本單位,屬於進程,共享進程內存 (堆、方法區)、文件句柄,擁有獨立棧、程序計數器、局部變量。線程間通信輕量 (共享內存、volatile、鎖、ThreadLocal)。
  • 一個進程可包含多個線程,線程被稱為「輕量級進程」。

8. Java 垃圾回收 (GC) 目的、觸發時機?

目的:自動識別並回收不可達對象佔用的堆內存,防止內存洩漏/OOM,提高開發效率。
觸發時機:

  • Minor GC:新生代 Eden 區滿。
  • Major/Full GC:老年代滿、元空間滿、System.gc()、堆內存分配擔保失敗、CMS/G1 並發模式失敗退化。

9. finalize() 方法何時調用?作用?

調用時機:GC 線程發現對象不可達且未覆寫 finalize() 或已調用過時,將對象放入 Finalizer 隊列,由低優先級 Finalizer 線程稍後調用。
作用:釋放非堆資源 (文件句柄、Socket、Native 內存、數據庫連接)。
缺陷:調用時間不確定、可能導致對象復活、拋出異常會中斷最終化、性能差。JDK 9 標記棄用,推薦 try-with-resources / AutoCloseable / Cleaner (JDK 9+)。

10. 對象引用置 null,GC 會立即回收嗎?

不會。置 null 僅切斷引用鏈,對象變為「不可達」,下一次 GC 掃描到該區域時才會回收。GC 運行由 JVM 根據內存壓力決定,不可人為強制 ( System.gc() 僅建議)。

面試加分點:深度追問預判

  1. JVM 內存結構 (堆/棧/方法區/元空間/直接內存) 及參數調優 (-Xms -Xmx -Xmn -XX:MetaspaceSize)。
  2. 垃圾收集器演進 (Serial → Parallel → CMS → G1 → ZGC/Shenandoah) 及選型邏輯。
  3. 類加載機制 (雙親委派、打破委派場景: Tomcat/JDBC/SPI/熱部署)。
  4. volatile 內存語義 (可見性、有序性、禁止指令重排) 與 synchronized/CAS 對比。
  5. AQS 框架原理、ReentrantLock/ReadWriteLock/CountDownLatch/Semaphore 實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved