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

Java 高頻面試題精選:核心知識點深度解析

     編輯:Java 相關知識

一、Thread.sleep() vs Object.wait()

維度sleep()wait()
所屬類別Thread (static)Object (instance)
鎖行為不釋放鎖釋放鎖,進入等待隊列
喚醒方式時間到期 / interrupt()notify() / notifyAll()
使用前提任意位置必須在 synchronized 區塊/方法中
典型用途暫停執行、限流線程協作、生產消費者模式

關鍵點:Thread.sleep(0) 觸發 OS 重新調度,讓出 CPU 時間片。

二、HashMap vs Hashtable

特性HashMapHashtable
線程安全非線程安全 (JDK 1.2+)同步方法,線程安全
Null 鍵/值允許一個 null key、多個 null value不允許 null
效能高(無同步開銷)低(全方法同步)
繼承體系實作 Map 介面繼承 Dictionary (舊API)
遍歷方式Iterator (fail-fast)Enumerator + Iterator

現代替代:多線程環境用 ConcurrentHashMap(分段鎖/CAS,高併發)。

三、throw vs throws

關鍵字位置功能異常數量
throw方法體內拋出具體異常實例單一
throws方法簽名聲明可能拋出的異常類型多個,逗號分隔
public void readFile(String path) throws IOException, SQLException {
    if (path == null) throw new IllegalArgumentException("路徑不能為空");
    // ...
}

四、記憶體溢出 vs 記憶體洩漏

OutOfMemoryError (OOM)

  • 請求記憶體超過 JVM 可用上限(-Xmx)。
  • 例子:List list = new ArrayList<>(); while(true) list.add(new byte[1024*1024]);

Memory Leak

  • 物件不再被使用但 GC 無法回收(被 GC Roots 間接引用)。
  • 長期積累最終導致 OOM。

四大洩漏類型

  1. 常發性:每次執行都洩漏(如未關閉的連接、未移除的監聽器)。
  2. 偶發性:特定條件觸發(如特定輸入導致集合無限增長)。
  3. 一次性:初始化時洩漏(如靜態集合未清理)。
  4. 隱式:運行過程持續分配,僅在結束時釋放(如緩存無淘汰策略)。

常見洩漏源與防範

五、String / StringBuilder / StringBuilder

洩漏源原因解決方案
靜態集合生命週期=應用,元素無法回收用 WeakHashMap、定期清理、避免長期持有
未關閉資源Connection/Stream/Thread 持有原生資源try-with-resources、finally 關閉
內部類持有外部引用非靜態內部類隱含 this 參考靜態內部類 + WeakReference
監聽器/回調未移除發布者持有訂閱者引用提供 removeListener、生命週期綁定
ThreadLocal 未清理線程池複用導致值殘留用完 remove()、繼承 ThreadLocalMap 清理

最佳實踐:單線程用 StringBuilder,多線程用 StringBuffer,常量字串用 String。

六、陣列 vs 鏈表 vs ArrayList vs LinkedList

底層結構對比

特性StringStringBufferStringBuilder
可變性不可變 (final char[])可變 (char[])可變 (char[])
線程安全是 (不可變天然安全)是 (方法 synchronized)否
效能拼接產生大量臨時物件同步開銷較大最高 (單線程首選)
繼承關係final classextends AbstractStringBuilderextends AbstractStringBuilder
結構記憶體隨機存取插入/刪除擴容
陣列連續 (堆/棧)O(1)O(n) 需位移固定長度
鏈表離散 (堆)O(n)O(1) 找到位置後動態
ArrayList動態陣列O(1)O(n) 含擴容拷貝1.5倍擴容
LinkedList雙向鏈表O(n)O(1) 首尾/迭代器位置無擴容

選型指南

  • 頻繁隨機存取、尾部增刪、元素量穩定 → ArrayList
  • 頻繁頭部/中間增刪、無隨機存取、併發迭代 → LinkedList
  • 固定大小、極致效能、基本型別 → 陣列

七、面試加分回答技巧

  1. 結構化表達:定義 → 區別 → 原理 → 應用場景 → 避坑指南。
  2. 源碼視角:引用關鍵源碼(如 HashMap.put() 擴容邏輯、ThreadLocal 洩漏機制)。
  3. 實戰案例:結合專案經歷說明如何排查 OOM、優化鎖競爭、選型集合。
  4. 版本演進:JDK 7/8/11/17 關鍵變更(如 HashMap 紅黑樹、GC 收集器、String 緊湊字串)。

總結

這些高頻題考察的是 Java 核心機制的理解深度。背誦答案不如掌握底層原理:記憶體模型、併發機制、集合源碼、JVM 調優。建議配合 OpenJDK 源碼閱讀、JOL 物件佈局分析、JMH 基準測試,從「知其然」進階到「知其所以然」。

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