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

Java 核心面試題精選:從 OOP 基礎到集合、多線程、JVM 全維度解析

     編輯:Java 相關知識

本文匯總 Java 面試高頻題目,涵蓋面向對象編程、核心語法、集合框架、多線程、JVM 垃圾回收、異常處理、Applet 等核心領域,助力求職者系統復習,面試官科學考察。

面向對象編程(OOP)四大支柱

封裝

隱藏對象內部狀態與行為,通過 public、private、protected 三種修飾符控制訪問權限。優勢:保護內部狀態、提升可用性與可維護性、禁止不良交互增強模塊化。

繼承

子類獲取父類字段與方法,實現代碼復用,無需修改父類即可擴展新特性。

多態

同一接口對不同底層數據類型統一操作,多態操作可應用於不同類型值。

抽象

從具體實例分離概念,按功能而非實現細節創建類。Java 支持抽象類(僅暴露接口無實現),核心目的是分離行為與實現細節。

抽象與封裝區別:抽象關注「做什麼」(行為),封裝關注「怎麼做」(細節隱藏)。封裝是實現抽象的策略之一。

Java 核心基礎高頻題

1. JVM 是什麼?為何 Java「平台無關」?

JVM 是執行字節碼的虛擬機進程。Java 源碼編譯為字節碼,JVM 屏蔽底層硬件差異,實現「一次編寫,到處運行」。

2. JDK 與 JRE 差異?

JRE = JVM + 基礎類庫 + 瀏覽器插件(運行環境);JDK = JRE + 編譯器(javac)+ 調試器 + JavaDoc 等開發工具(開發套件)。

3. static 含義?能否覆蓋 private/static 方法?

static 成員屬於類而非實例,無需實例即可訪問。static 方法編譯期靜態綁定,不可覆蓋(覆蓋需運行期動態綁定)。private 方法不可見,自然不可覆蓋。

4. 能否在 static 環境訪問非 static 變量?

不能。static 變量類加載時初始化,屬於類;非 static 變量需實例創建後才存在,無實例無法訪問。

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

byte, short, int, long, float, double, boolean, char。自動裝箱:基本類型→包裝類(如 int→Integer);拆箱反之。編譯器自動完成轉換。

6. 方法覆蓋 vs 重載?

重載:同類中方法名同、參數不同;覆蓋:子類重寫父類方法,方法名、參數列表、返回類型必須相同,訪問權限不得更嚴格。

7. 構造函數、重載、複製構造函數?

新對象創建時調用構造函數,無定義則編譯器生成默認無參構造。構造函數重載類似方法重載,參數列表唯一。Java 無 C++ 式複製構造函數,無默認複製構造。

8. Java 支持多繼承嗎?

類單繼承,可實現多接口。

9. 接口與抽象類區別?

  • 接口方法隱含 abstract,抽象類可含非抽象方法
  • 類可實現多接口,只能繼承一抽象類
  • 實現接口必須實現所有方法;繼承抽象類可不實現(但類需聲明 abstract)
  • 接口變量默認 final,抽象類可含非 final 變量
  • 接口方法默認 public,抽象類方法可 private/protected/public
  • 兩者均不可實例化,但抽象類含 main 可調用

10. 值傳遞 vs 引用傳遞?

Java 僅支持值傳遞。對象傳遞的是引用的副本,修改副本指向不影響原引用;但通過副本修改對象內部狀態則對原對象可見。

Java 多線程核心題

11. 進程與線程區別?

進程 = 執行中程式(資源分配單位);線程 = 進程內執行序列(調度單位)。一進程可含多線程,線程稱輕量級進程。

12. 創建線程三種方式?推薦哪種?

  • 繼承 Thread
  • 實現 Runnable
  • 使用 Executor 框架(線程池)

推薦 Runnable:避免單繼承限制,配合線程池高效復用線程。

13. 線程六大狀態?

就緒、運行中、等待中、睡眠中、I/O 阻塞、同步阻塞、死亡。

14. 同步方法 vs 同步代碼塊?

每個對象有一把鎖。synchronized 可用於方法級(粗粒度鎖)或代碼塊級(細粒度鎖)。

15. 監視器如何實現線程同步?

監視器監視同步代碼塊,確保單線程執行。每個監視器關聯一對象引用。線程獲取鎖前不可進入同步代碼。

16. 什麼是死鎖?

兩進程互相等待對方釋放資源,陷入無限等待。

17. 如何避免 N 線程訪問 N 資源死鎖?

指定統一獲取鎖順序,強制所有線程按序加鎖/釋放鎖。

Java 集合框架深度解析

18. 基本接口?

Collection(根)、Set(無重複)、List(有序可重複)、Map(鍵值映射,鍵唯一)。

19. 為何集合接口不實現 Cloneable/Serializable?

具體實現類自行決定存儲方式與語義,接口不強制規定。

20. 迭代器?

Iterator 提供遍歷與刪除功能。克隆/序列化語義由具體實現決定。

21. Iterator vs ListIterator?

ListIterator 僅用於 List,支持雙向遍歷、增刪改、索引獲取;Iterator 僅單向遍歷 Set/List。

22. 快速失敗 vs 安全失敗?

快速失敗(java.util):基於原集合,修改時拋 ConcurrentModificationException。安全失敗(java.util.concurrent):基於副本,不拋異常。

23. HashMap 工作原理?

鍵值對存儲,通過 hashCode() 計算索引,equals() 解決衝突。核心屬性:容量、負載因子、擴容閾值。

24. hashCode() 與 equals() 關鍵性?

決定鍵值對索引與相等性判斷,實現錯誤導致不同鍵誤判為相同,破壞集合正確性。

25. HashMap vs Hashtable?

  • HashMap 允許 null 鍵值,非同步,適合單線程,快速失敗
  • Hashtable 禁止 null,同步,適合多線程,枚舉遍歷,屬遺留類

26. 數組 vs ArrayList?

數組:固定大小,支持基本類型與對象;ArrayList:動態擴容,僅對象,功能豐富(addAll 等)。基本類型用數組性能更優。

27. ArrayList vs LinkedList?

ArrayList:數組底層,隨機訪問 O(1),插刪慢;LinkedList:雙向鏈表,插刪快 O(1),訪問 O(n),佔更多內存(雙引用)。

28. Comparable vs Comparator?

Comparable:內部比較 compareTo();Comparator:外部比較 compare() + equals()。

29. 優先級隊列?

PriorityQueue:無界堆,自然序或自定義比較器,非線程安全,入/出隊 O(log n)。

30. 大 O 符號與數據結構選型?

描述最壞情況時間/空間複雜度,指導海量數據下的性能選型。

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

有序:查找 O(log n),插入 O(n);無序:查找 O(n),插入 O(1)。

32. 集合最佳實踐?

  • 按需選型(固定大小用數組)
  • 預估容量避免擴容
  • 全面使用泛型(類型安全、避免 ClassCastException)
  • 用 JDK 不變類作 Map 鍵(免實現 hashCode/equals)
  • 面向接口編程
  • 空集合返回長度 0 的集合/數組,不返回 null

33. Enumeration vs Iterator?

Enumeration 速度快、內存少,但不安全(無并發保護)、不支持刪除;Iterator 安全、支持刪除。

34. HashSet vs TreeSet?

HashSet:哈希表,無序,增刪查 O(1);TreeSet:紅黑樹,有序,增刪查 O(log n)。

垃圾收集器(GC)專題

35. GC 目的與觸發時機?

識別並丟棄不再使用的對象,釋放重用資源。內存不足或達閾值觸發。

36. System.gc() / Runtime.gc() 作用?

提示 JVM 進行 GC,具體執行時間由 JVM 決定。

37. finalize() 調用時機與目的?

GC 回收內存前調用,建議釋放對象持有的非內存資源(文件句柄、連接等)。

38. 引用置 null 後 GC 立即回收嗎?

否,下一個 GC 週期中可回收。

39. Java 堆結構與永久代?

堆 = 運行時數據區,存放實例與數組。分存活/死亡對象。永久代存類元數據,滿觸發 Full GC。註:Java 8 移除永久代,改為元數據區(本地內存)。

40. 串行 vs 吞吐量收集器?

吞吐量收集器:並行新生代 GC,適合中大型應用;串行收集器:單線程,適合小應用(~100MB)。

41. 對象何時可被 GC 回收?

對應用程式不可觸及時。

42. 永久代會發生 GC 嗎?

永久代不單獨 GC,滿時觸發 Full GC。正確設定永久代大小對避免 Full GC 關鍵。

異常處理體系

43. 兩類異常?

受檢異常(checked):須 throws 聲明;非受檢異常(unchecked,RuntimeException 及子類):無需聲明,可拋出方法外。

44. Exception vs Error?

同繼承 Throwable。Exception:用戶程式可捕獲處理;Error:系統級嚴重錯誤,不期望捕獲(如 OutOfMemoryError)。

45. throw vs throws?

throw:拋出具體異常實例;throws:聲明方法不處理的異常類型,多個用逗號分隔。

46. finally 塊重要性?

無論是否拋出異常均執行(即使無 catch 且拋出異常)。主用於資源釋放(I/O 緩衝、數據庫連接)。

47. 異常處理後 Exception 對象去向?

下一輪 GC 回收。

48. finally vs finalize()?

finally:語法塊,保證執行,釋放資源;finalize():Object 方法,GC 前由 JVM 調用。

Applet 專題(歷史技術,了解即可)

49-56. Applet 生命週期、加載流程、與應用程式區別、安全限制、類加載器、安全管理器等

Applet 嵌入 HTML、瀏覽器運行,生命週期:init→start→stop→destroy。無 main 方法。受嚴格安全策略限制(無本地文件/網絡/進程訪問)。網絡加載受 AppletClassLoader + SecurityManager 管控;本地加載權限較大但不通過字節碼驗證。

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