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

Java 面試核心題庫(上):OOP 基石、集合框架與 JVM 核心機制

     編輯:Java 相關知識

導讀

本文精選 Java 面試高頻考點,涵蓋面向對象設計原理、Java 語言核心特性、集合框架底層實現、垃圾回收機制等模組。每題附帶標準解析與進階延伸,助你構建完整知識體系,應對初中級開發崗位面試。

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

1. 封裝

定義:隱藏對象內部狀態與實現細節,僅暴露公共方法供外部交互。

三大權限修飾符:

  • public:全域可見
  • protected:同包 + 子類可見
  • private:僅類內可見

核心優勢:

  1. 保護對象內部狀態不被破壞
  2. 提高代碼復用性與可維護性
  3. 減少模組間耦合,增強系統靈活性

2. 繼承

本質:子類獲取父類非私有屬性與方法,實現代碼復用與擴展。

Java 單繼承限制:一個類只能 extends 一個父類,但可 implements 多個介面。

3. 多態

定義:同一操作作用於不同對象產生不同行為(編譯時多態:重載;運行時多態:重寫)。

實現條件:繼承關係 + 方法重寫 + 父類引用指向子類對象。

4. 抽象

核心:關注「做什麼」而非「怎麼做」。抽象類可包含抽象/具體方法;介面(JDK 8 前)僅含抽象方法。

抽象 vs 封裝:抽象關注行為邊界,封裝關注實現細節隱藏。封裝是實現抽象的手段之一。

5. 介面 vs 抽象類(高頻考點)

維度介面抽象類
方法類型隱含 public abstract(JDK8+ 可有 default/static/private)可混合抽象與具體方法
繼承關係implements,可多實現extends,單繼承
變量隱含 public static final可定義實例/靜態變量
構造器無有(供子類調用)
設計意圖定義行為契約提供部分實現與共享狀態

二、Java 核心基礎高頻題

1. JVM、JRE、JDK 關係

  • JVM:執行字節碼的虛擬機,屏蔽底層硬件差異,實現「一次編譯,到處運行」
  • JRE:JVM + 核心類庫,運行 Java 程序的最小環境
  • JDK:JRE + 編譯器(javac) + 調試/文檔工具,開發必備

2. static 關鍵字深度解析

  • 修飾變量/方法:屬於類而非實例,類加載時初始化
  • static 方法不可重寫:靜態綁定(編譯期),非動態綁定(運行期)
  • static 方法中不可直接訪問非 static 成員(無 this 引用)

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

byte(1B) short(2B) int(4B) long(8B)
float(4B) double(8B) boolean(~1B) char(2B)

自動裝箱:基本類型 → 包裝類型(如 int → Integer.valueOf())
自動拆箱:包裝類型 → 基本類型(如 Integer → intValue())
陷阱:頻繁拆裝箱產生大量臨時對象,影響性能;== 比較包裝類型時需注意緩存範圍(-128~127)。

4. 重載 vs 重寫

重載重寫
範圍同一類內父子類間
方法名相同相同
參數列表必須不同必須相同
返回類型可不同兼容/相同
綁定時機編譯期運行期

5. 構造器細節

  • 無參構造器:類無顯式構造器時編譯器自動生成
  • 構造器重載:參數列表不同即可
  • 無複製構造器:Java 不像 C++ 支持複製構造器,需自行實現 clone() 或拷貝構造器

6. 值傳遞 vs 引用傳遞(經典陷阱)

結論:Java 只有值傳遞。

  • 基本類型:傳遞值的副本
  • 引用類型:傳遞引用的副本(即記憶體地址副本)

方法內修改引用指向的對象內容會影響外部,但修改引用本身(指向新對象)不影響外部。

三、Java 多線程核心考點

1. 進程 vs 線程

  • 進程:資源分配基本單位,獨立地址空間,切換開銷大
  • 線程:CPU 調度基本單位,共享進程資源,擁有獨立棧/PC 計數器,切換輕量

2. 三種創建線程方式

  1. 繼承 Thread 類,重寫 run()
  2. 實現 Runnable 介面(推薦:避免單繼承限制,便於線程池管理)
  3. 使用 ExecutorService 線程池(生產環境首選)

3. 線程六大狀態

  1. NEW:新建未啟動
  2. RUNNABLE:就緒/運行中(含 OS 調度等待)
  3. BLOCKED:等待監視器鎖
  4. WAITING:無限期等待(wait/join 無超時)
  5. TIMED_WAITING:限時等待(sleep/wait/join 帶超時)
  6. TERMINATED:執行結束

4. 同步機制

  • synchronized 方法:鎖住當前實例(this)
  • synchronized 靜態方法:鎖住 Class 對象
  • synchronized(this) { } 同步塊:細粒度鎖,減小鎖範圍
  • 監視器:每個對象關聯一把鎖,同步塊進入需獲取鎖

5. 死鎖與預防

死鎖條件:互斥 + 請求保持 + 不剝佔 + 循環等待。
預防策略:統一鎖獲取順序(如按 hashCode 排序),打破循環等待條件。

四、集合框架深度解析

1. 核心介面體系

Collection
 ├─ List(有序、可重複) → ArrayList, LinkedList, Vector
 ├─ Set(無序、不可重複) → HashSet, LinkedHashSet, TreeSet
 └─ Queue(隊列) → PriorityQueue, ArrayDeque

Map(鍵值對、Key 唯一) → HashMap, LinkedHashMap, TreeMap, Hashtable

2. 為什麼 Collection 不實現 Cloneable/Serializable?

具體實現類決定存儲方式(有序/無序、可重複/不可重複),語義由具體類定義,不宜在介面層強制約束。

3. Iterator vs ListIterator

IteratorListIterator
適用集合Collection 所有實現僅 List
遍歷方向單向雙向
增強功能無add/set/previous/索引獲取

4. Fail-fast vs Fail-safe

  • Fail-fast(java.util):直接讀取原集合,檢測到修改拋 ConcurrentModificationException
  • Fail-safe(java.util.concurrent):遍歷副本,不拋異常,適合高併發

5. HashMap 核心原理(必考)

  • 底層:數組 + 鏈表 + 紅黑樹(JDK8+ 鏈表長度>8 且容量>64 轉樹)
  • 核心方法:hashCode() 計算索引,equals() 解決哈希衝突
  • 關鍵參數:初始容量(16)、負載因子(0.75)、擴容閾值
  • put 流程:計算 hash → 定位桶位 → 鏈表/樹查重 → 插入/覆蓋 → 擴容檢查

6. hashCode() 與 equals() 契約

  1. equals 相等 → hashCode 必相等
  2. hashCode 相等 → equals 不一定相等(哈希衝突)
  3. 重寫 equals 必須重寫 hashCode,否則在 HashMap/HashSet 中失效

7. HashMap vs Hashtable

HashMapHashtable
同步性非線程安全同步(效能低)
Null 支持允許 1 個 null Key + 多個 null Value完全不允許 null
迭代器Fail-fast IteratorEnumeration(舊API)
推薦場景單線程/配合 ConcurrentHashMap遺留類,不推薦新代碼使用

8. ArrayList vs LinkedList

操作ArrayList(動態數組)LinkedList(雙向鏈表)
隨機訪問O(1) ✓O(n) ✗
頭尾增刪O(n) / O(1)*O(1) ✓
中間增刪O(n) 搬移元素O(n) 定位 + O(1) 操作
記憶體緊湊,僅存數據額外存前後指針

* 尾部擴容均攤 O(1)

9. Comparable vs Comparator

  • Comparable:內部比較器,compareTo(this, other),類自然排序
  • Comparator:外部比較器,compare(o1, o2),多種排序策略

10. PriorityQueue 特性

  • 基於最小堆,無界隊列
  • 自然序或自定義 Comparator 排序
  • 不允許 null 元素
  • 非線程安全,入隊/出隊 O(log n)

五、垃圾回收機制

1. GC 目標與觸發時機

  • 目標:識別並回收不可達對象,釋放記憶體
  • 觸發:Eden 區滿、老年代滿、Metaspace 不足、手動 System.gc()(僅建議)

2. 核心方法

  • finalize():GC 前調用(不推薦使用,JDK9 已棄用),釋放非記憶體資源
  • 引用置 null:下一輪 GC 可回收,非即時

3. 堆結構與代際演進

  • 新生代:Eden + S0 + S1(Minor GC)
  • 老年代:大對象/長壽對象(Major/Full GC)
  • 永久代 → 元空間:JDK8 移除 PermGen,類元數據存 Native 記憶體

4. 收集器對比

Serial(串行)Parallel(吞吐量優先)
特點單線程,Stop-the-world多線程並行,關注吞吐量
適用場景Client 模式、小應用Server 模式、大數據/批處理

5. 判斷對象可回收

  • 引用計數法(簡單但難解決循環引用)
  • 可達性分析:GC Roots(棧帧引用、靜態屬性、常量、JNI 引用等)向下搜索,不可達即可回收

下篇預告:異常處理體系、I/O 流與 NIO、反射與註解、JVM 調優實戰、Spring 生態核心原理等進階專題。

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