本文匯總 Java 面試高頻題目,涵蓋面向對象編程、核心語法、集合框架、多線程、JVM 垃圾回收、異常處理、Applet 等核心領域,助力求職者系統復習,面試官科學考察。
隱藏對象內部狀態與行為,通過 public、private、protected 三種修飾符控制訪問權限。優勢:保護內部狀態、提升可用性與可維護性、禁止不良交互增強模塊化。
子類獲取父類字段與方法,實現代碼復用,無需修改父類即可擴展新特性。
同一接口對不同底層數據類型統一操作,多態操作可應用於不同類型值。
從具體實例分離概念,按功能而非實現細節創建類。Java 支持抽象類(僅暴露接口無實現),核心目的是分離行為與實現細節。
抽象與封裝區別:抽象關注「做什麼」(行為),封裝關注「怎麼做」(細節隱藏)。封裝是實現抽象的策略之一。
JVM 是執行字節碼的虛擬機進程。Java 源碼編譯為字節碼,JVM 屏蔽底層硬件差異,實現「一次編寫,到處運行」。
JRE = JVM + 基礎類庫 + 瀏覽器插件(運行環境);JDK = JRE + 編譯器(javac)+ 調試器 + JavaDoc 等開發工具(開發套件)。
static 含義?能否覆蓋 private/static 方法?static 成員屬於類而非實例,無需實例即可訪問。static 方法編譯期靜態綁定,不可覆蓋(覆蓋需運行期動態綁定)。private 方法不可見,自然不可覆蓋。
不能。static 變量類加載時初始化,屬於類;非 static 變量需實例創建後才存在,無實例無法訪問。
byte, short, int, long, float, double, boolean, char。自動裝箱:基本類型→包裝類(如 int→Integer);拆箱反之。編譯器自動完成轉換。
重載:同類中方法名同、參數不同;覆蓋:子類重寫父類方法,方法名、參數列表、返回類型必須相同,訪問權限不得更嚴格。
新對象創建時調用構造函數,無定義則編譯器生成默認無參構造。構造函數重載類似方法重載,參數列表唯一。Java 無 C++ 式複製構造函數,無默認複製構造。
類單繼承,可實現多接口。
abstract,抽象類可含非抽象方法abstract)final,抽象類可含非 final 變量public,抽象類方法可 private/protected/publicmain 可調用Java 僅支持值傳遞。對象傳遞的是引用的副本,修改副本指向不影響原引用;但通過副本修改對象內部狀態則對原對象可見。
進程 = 執行中程式(資源分配單位);線程 = 進程內執行序列(調度單位)。一進程可含多線程,線程稱輕量級進程。
ThreadRunnableExecutor 框架(線程池)推薦 Runnable:避免單繼承限制,配合線程池高效復用線程。
就緒、運行中、等待中、睡眠中、I/O 阻塞、同步阻塞、死亡。
每個對象有一把鎖。synchronized 可用於方法級(粗粒度鎖)或代碼塊級(細粒度鎖)。
監視器監視同步代碼塊,確保單線程執行。每個監視器關聯一對象引用。線程獲取鎖前不可進入同步代碼。
兩進程互相等待對方釋放資源,陷入無限等待。
指定統一獲取鎖順序,強制所有線程按序加鎖/釋放鎖。
Collection(根)、Set(無重複)、List(有序可重複)、Map(鍵值映射,鍵唯一)。
Cloneable/Serializable?具體實現類自行決定存儲方式與語義,接口不強制規定。
Iterator 提供遍歷與刪除功能。克隆/序列化語義由具體實現決定。
Iterator vs ListIterator?ListIterator 僅用於 List,支持雙向遍歷、增刪改、索引獲取;Iterator 僅單向遍歷 Set/List。
快速失敗(java.util):基於原集合,修改時拋 ConcurrentModificationException。安全失敗(java.util.concurrent):基於副本,不拋異常。
HashMap 工作原理?鍵值對存儲,通過 hashCode() 計算索引,equals() 解決衝突。核心屬性:容量、負載因子、擴容閾值。
hashCode() 與 equals() 關鍵性?決定鍵值對索引與相等性判斷,實現錯誤導致不同鍵誤判為相同,破壞集合正確性。
HashMap vs Hashtable?HashMap 允許 null 鍵值,非同步,適合單線程,快速失敗Hashtable 禁止 null,同步,適合多線程,枚舉遍歷,屬遺留類ArrayList?數組:固定大小,支持基本類型與對象;ArrayList:動態擴容,僅對象,功能豐富(addAll 等)。基本類型用數組性能更優。
ArrayList vs LinkedList?ArrayList:數組底層,隨機訪問 O(1),插刪慢;LinkedList:雙向鏈表,插刪快 O(1),訪問 O(n),佔更多內存(雙引用)。
Comparable vs Comparator?Comparable:內部比較 compareTo();Comparator:外部比較 compare() + equals()。
PriorityQueue:無界堆,自然序或自定義比較器,非線程安全,入/出隊 O(log n)。
描述最壞情況時間/空間複雜度,指導海量數據下的性能選型。
有序:查找 O(log n),插入 O(n);無序:查找 O(n),插入 O(1)。
ClassCastException)Map 鍵(免實現 hashCode/equals)nullEnumeration vs Iterator?Enumeration 速度快、內存少,但不安全(無并發保護)、不支持刪除;Iterator 安全、支持刪除。
HashSet vs TreeSet?HashSet:哈希表,無序,增刪查 O(1);TreeSet:紅黑樹,有序,增刪查 O(log n)。
識別並丟棄不再使用的對象,釋放重用資源。內存不足或達閾值觸發。
System.gc() / Runtime.gc() 作用?提示 JVM 進行 GC,具體執行時間由 JVM 決定。
finalize() 調用時機與目的?GC 回收內存前調用,建議釋放對象持有的非內存資源(文件句柄、連接等)。
null 後 GC 立即回收嗎?否,下一個 GC 週期中可回收。
堆 = 運行時數據區,存放實例與數組。分存活/死亡對象。永久代存類元數據,滿觸發 Full GC。註:Java 8 移除永久代,改為元數據區(本地內存)。
吞吐量收集器:並行新生代 GC,適合中大型應用;串行收集器:單線程,適合小應用(~100MB)。
對應用程式不可觸及時。
永久代不單獨 GC,滿時觸發 Full GC。正確設定永久代大小對避免 Full GC 關鍵。
受檢異常(checked):須 throws 聲明;非受檢異常(unchecked,RuntimeException 及子類):無需聲明,可拋出方法外。
Exception vs Error?同繼承 Throwable。Exception:用戶程式可捕獲處理;Error:系統級嚴重錯誤,不期望捕獲(如 OutOfMemoryError)。
throw vs throws?throw:拋出具體異常實例;throws:聲明方法不處理的異常類型,多個用逗號分隔。
finally 塊重要性?無論是否拋出異常均執行(即使無 catch 且拋出異常)。主用於資源釋放(I/O 緩衝、數據庫連接)。
Exception 對象去向?下一輪 GC 回收。
finally vs finalize()?finally:語法塊,保證執行,釋放資源;finalize():Object 方法,GC 前由 JVM 調用。
Applet 嵌入 HTML、瀏覽器運行,生命週期:init→start→stop→destroy。無 main 方法。受嚴格安全策略限制(無本地文件/網絡/進程訪問)。網絡加載受 AppletClassLoader + SecurityManager 管控;本地加載權限較大但不通過字節碼驗證。