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

Java 核心面試寶典:從 JDK/JRE 區別到 JVM 內存模型的 50 道高頻題深度解析

     編輯:Java 綜合教學

Java 核心知識體系大檢閱:50 道高頻面試題深度解析

本文匯總 Java 基礎、集合、併發、JVM、類加載、GC 等核心領域 50 道高頻面試題,每題附帶「標準答案 + 底層原理 + 實戰避坑」,助你構建完整知識網絡,從容應對初中高級崗位面試。

一、基礎語言特性 (Q1-Q10)

Q1. JDK vs JRE vs JVM 三者關係?

JDK = JRE + 編譯/診斷工具 + 源碼;JRE = JVM + 核心類庫;JVM = 執行引擎。開發用 JDK,運行用 JRE,JVM 是跨平台基石。

Q2. CLASSPATH 作用與動態指定類搜索路徑?

告訴類加載器去哪裡找 .class/jar。動態指定:java -cp /path/to/jar:./classes MainClass 或 -classpath。

Q3. 打包可執行 JAR 關鍵步驟?

jar cvfe app.jar com.MainClass -C out/ .,Manifest 中指定 Main-Class,雙擊即可運行。

Q4. static 關鍵字含義?能否 override static/private 方法?

屬於類而非實例,編譯期靜態綁定。static 不能 override(可隱藏),private 不可見不可 override。

Q5. static 方法能否訪問非 static 變量?

不能。static 階段實例尚未創建,非 static 成員不存在。

Q6. 八大基本類型與自動拆裝箱?

byte/short/int/long/float/double/boolean/char。編譯器自動在基本類型與包裝類轉換(Integer.valueOf/intValue),緩存 -128~127。

Q7. Override vs Overload 差異?

Override:子類重寫父類方法,簽名相同,運行期動態綁定。Overload:同類中方法名同參數表不同,編譯期靜態綁定。

Q8. 構造器、重載、復制構造器?

新對象創建時調用。Java 無 C++ 式復制構造器,需自行實現 clone() 或複製構造器。

Q9. Java 支援多繼承嗎?

類單繼承,介面多實現。默認方法讓介面擁有行為復用能力。

Q10. 介面 vs 抽象類核心差異?

介面:全隱式 public static final 字段、default/static 方法、多實現。抽象類:可有構造器、非 final 字段、任意訪問權限、單繼承。

二、傳遞機制與併發基礎 (Q11-Q18)

Q11. 值傳遞 vs 引用傳遞?Java 是哪種?

Java 唯有值傳遞。傳對象時傳「引用的副本」,可修改對象內部狀態,不可替換引用本身。

Q12. 進程 vs 線程?創建線程三種方式?

進程=資源分配單位,線程=調度單位。繼承 Thread、實現 Runnable、Executor 線程池(推薦)。

Q13. 線程六大狀態?

NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。

Q14. synchronized 方法 vs 代碼塊?

方法級=粗粒度鎖(this/class),代碼塊=細粒度鎖(任意對象),後者併發度更高。

Q15. Monitor 鎖機制?

每個對象關聯一把 Monitor,synchronized 獲取鎖進入臨界區,wait/notify 依賴 Monitor。

Q16. 死鎖四條件與預防?

互斥、持有等待、不可搶佔、循環等待。預防:統一鎖獲取順序、嘗試性獲取 (tryLock)、超時釋放。

Q17. 集合框架核心介面?

Collection → Set/List/Queue;Map(非 Collection 子介面)。

Q18. 為什麼集合介面不實現 Cloneable/Serializable?

具體實現決定存儲方式(有序/無序、可重複/不可重複),介面不應強制序列化/克隆策略。

三、集合進階與迭代器 (Q19-Q28)

Q19. Iterator vs ListIterator?

前者單向遍歷 Collection,後者雙向遍歷 List 且支援增刪改、索引獲取。

Q20. Fail-fast vs Fail-safe?

Fail-fast:直接讀取原集合,檢測 modCount 變化拋 CME(java.util)。Fail-safe:遍歷副本,無 CME(java.util.concurrent)。

Q21. HashMap 工作原理核心三要素?

hashCode()、equals()、鏈表/紅黑樹解決碰撞。JDK 8 引入樹化閾值 8。

Q22. hashCode/equals 契約為何關鍵?

違反契約導致「邏輯相同 key 進不同桶」或「不同 key 進同桶且誤判相等」,破壞 Map 語義。

Q23. HashMap vs Hashtable?

前者非同步、允許 null、Iterator fail-fast;後者同步、不允許 null、Enumeration、遺留類。

Q24. Array vs ArrayList 選擇?

基本類型固定長 → Array;對象、動態擴容、豐富 API → ArrayList。

Q25. ArrayList vs LinkedList?

隨機訪問 O(1) vs O(n);插刪尾部同速,中間 LinkedList 快(無擴容/移位);LinkedList 佔更多內存(雙向指針)。

Q26. Comparable vs Comparator?

前者內部比較 (compareTo),自然順序;後者外部策略 (compare),多種排序邏輯共存。

Q27. PriorityQueue 底層與特性?

最小堆(數組實現),O(log n) 入隊/出隊,非線程安全,不允許 null,可傳 Comparator 定制順序。

Q28. Big-O 符號與常見結構複雜度?

描述最壞情況增長率。ArrayList 查找 O(1) 擴容 O(n);LinkedList 查找 O(n) 插刪 O(1);HashMap 增刪查 O(1) 平均。

四、數組與排序策略 (Q29-Q31)

Q29. 有序 vs 無序數組權衡?

有序:二分查找 O(log n),插入 O(n);無序:查找 O(n),插入 O(1)。按查找/寫入比例選擇。

Q30. 集合最佳實踐三條?

預估大小指定初始容量、全程泛型、優先介面編程(List<> list = new ArrayList<>())、空集合返回空實例而非 null。

Q31. Enumeration vs Iterator?

Enumeration 速度快、內存少、只讀;Iterator 安全(fail-fast)、支援 remove、標準化。

五、Set/Map 進階與 GC 核心 (Q32-Q42)

Q32. HashSet vs TreeSet?

HashSet:HashMap 鍵,無序,O(1);TreeSet:紅黑樹,有序,O(log n)。

Q33. GC 目的與觸發時機?

回收不可達對象釋放內存。觸發:新生代滿、老年代滿、Metaspace 滿、System.gc() 建議。

Q34. System.gc() vs Runtime.gc()?

同義,僅建議 JVM 執行 GC,不保證立即執行。

Q35. finalize() 機制與缺陷?

GC 前調用一次,不可靠(可能不執行、拋異常阻塞、性能差),Java 9 棄用,改用 Cleaner/try-with-resources。

Q36. 引用置 null 會立即 GC 嗎?

不會。下一 GC 週期可達性分析發現不可達才回收。

Q37. JVM 堆結構與永久代/元空間?

新生代 (Eden+S0+S1) + 老年代。JDK 8 移除永久代,類元數據移至本地內存 Metaspace,避免 OOM。

Q38. Serial vs Throughput GC?

Serial:單線程、小應用、Client 模式;Throughput:並行新生代、大吞吐、Server 模式默認。

Q39. 對象何時可被回收?

GC Roots 可達性分析不可達。強/軟/弱/虛引用影響判定時機。

Q40. 永久代會 GC 嗎?

會。類卸載條件嚴格(類加載器不可達、實例無引用、Class 對象無引用),Full GC 時觸發。

六、進階併發與類加載 (Q43-Q50)

Q43. volatile 可见性與有序性?

禁止指令重排、強制刷新主內存,不保證原子性(複合操作仍需鎖/CAS)。

Q44. CAS 原理與 ABA 問題?

Compare-And-Swap 原子指令。ABA:值 A→B→A 檢測失敗。解決:AtomicStampedReference 加版本號。

Q45. AQS 框架核心思想?

基於雙向隊列的狀態同步器,state 代表鎖狀態,tryAcquire/tryRelease 由子類實現,支援獨享/共享模式。

Q46. ReentrantLock vs synchronized?

前者可中斷、可超時、公平鎖、多 Condition、非阻塞獲取;後者語法簡單、JVM 優化好、死鎖自動釋放。

Q47. ThreadLocal 內存洩漏根因?

Key 弱引用被 GC → Entry.key=null → Value 強引用殘留 → 線程池長壽命導致洩漏。static final + remove() 破解。

Q48. 類加載五階段?

加載→驗證→準備→解析→初始化。雙親委派模型打破需重寫 loadClass。

Q49. final 關鍵字三大用法?

類不可繼承、方法不可覆蓋、變量不可修改(引用不變,對象內容可變)。

Q50. String、StringBuilder、StringBuffer 差異?

String 不可變;StringBuilder 非線程安全、高效;StringBuffer 同步、線程安全。拼接優先 Builder。

面試加分技巧

  • 回答「原理 + 源碼關鍵行 + 實戰場景 + 避坑經驗」四位一體
  • 手寫核心代碼:單例雙檢鎖、LRU、生產消費者、CAS 自旋
  • 對比表格總結:HashMap/ConcurrentHashMap、ArrayList/LinkedList、synchronized/Lock
  • 關注 JDK 新特性:JDK 8 Lambda/Stream、JDK 9 模塊化、JDK 11/17 LTS 增強

這 50 道題覆蓋 Java 後端開發 90% 核心考點。建議按模塊專項攻克,配合源碼閱讀與手寫代碼,將知識內化為肌肉記憶。祝你面試順利,Offer 滿懷!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved