本文精選 Java 面試高頻核心題 70+ 道,涵蓋基礎語法、面向對象、集合框架、異常處理、多線程、JVM、Web 基礎、Servlet/JSP 等模塊。每題給出標準答案要點、底層原理延伸及避坑指南,助力高效備戰。
答:可以,但僅允許一個 public 類,且 public 類名必須與文件名完全一致。其他類默認 package-private。
答:goto 是保留字,未使用。可用標號配合 break/continue 實現類似效果:outer: for(...) { inner: for(...) { break outer; } }。
if (str != null && !str.isEmpty())。答:外層循環前加標號 label:,內層用 break label; 或 continue label;。
byte/short/char/int 及包裝類、enum(1.5+)。String。long、float、double、boolean。s1+1 整型提升為 int,賦值回 short 需強轉。+= 隱含強轉:s1 = (short)(s1 + 1),編譯器自動處理。答:能。char 存 Unicode 碼點(UTF-16 代碼單元),佔 2 字節。BMP 內漢字直接存儲;補充平面字符(Emoji、罕用字)需 char[2](代理對)或 int 存碼點。
答:2 << 3(左移 3 位 = 乘 2³)。位運算 CPU 指令級,無函數調用開銷。
long 9e18,BigInteger 理論無上限(內存許可)。答:引用不可變(不能指向新對象),對象內容可變。
final List<String> list = new ArrayList<>(); list.add("ok"); // 編譯通過
list = new ArrayList<>(); // 編譯錯誤
==:基本類型比值,引用類型比地址(是否同一對象)。equals():Object 默認比地址;String/包裝類/集合類重寫比內容。業務類需自行重寫並遵守對稱、傳遞、一致性契約。ClassName.field 訪問,全局共享。new 時在堆分配,obj.field 訪問,各對象獨立副本。不能。靜態方法屬於類,調用時可能無實例對象;非靜態方法需綁定 this 實例。反之可行(實例方法可調用靜態方法)。
| 維度 | int | Integer |
|---|---|---|
| 類型 | 基本類型 | 包裝類(引用類型) |
| 默認值 | 0 | null |
| 泛型支持 | 無 | 可作類型參數 |
| 緩存池 | 無 | -128~127 自動緩存(valueOf) |
| NPE 風險 | 無 | 自動拆箱可能拋 NPE |
算法:floor(x + 0.5)。
round(11.5) = floor(12.0) = 12
round(-11.5) = floor(-11.0) = -11(注意:負數向零方向取整)。
| 修飾符 | 同類 | 同包 | 子類(異包) | 異包無關類 |
|---|---|---|---|---|
| public | ✓ | ✓ | ✓ | ✓ |
| protected | ✓ | ✓ | ✓ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| private | ✓ | ✗ | ✗ | ✗ |
不能。構造器不參與繼承,無法重寫。但可 Overload(重載) 多個構造器。
static main 方法(屬於類,不需實例)。super.clone()。先複製父類字段,再處理自身深拷貝需求。需實現 Cloneable 否則拋 CloneNotSupportedException。
父類引用指向子類對象(向上造型),方法調用根據**運行時對象實際類型**動態分派(JVM invokevirtual 指令查虛表),而非引用聲明類型。
| 特性 | abstract class | interface |
|---|---|---|
| 構造器 | 可有 | 不可有(Java 8 前) |
| 字段 | 任意 | 默認 public static final |
| 方法 | 可有非抽象方法 | Java 8 前全抽象;8+ 可 default/static/private |
| 訪問權限 | 任意 | 方法默認 public |
| 繼承/實現 | 單繼承 | 多實現 |
| 靜態方法 | 可有 | Java 8+ 支持 |
this,抽象方法無實體無法確定鎖對象。static class Inner,無外部類實例引用,只能訪問外部靜態成員,獨立存在。Outer.this 引用,可訪問外部所有成員(含私有),需 new Outer().new Inner() 創建。非靜態內部類:無限制(含私有)。靜態內部類:僅靜態成員。局部/匿名:僅 final/effectively final 局部變量。
必須:new SuperType() { ... } 或 new Interface() { ... },隱式繼承/實現,不可顯式寫關鍵字。
String、StringBuffer、StringBuilder、System、Math、包裝類、Enum 等。設計意圖:不可變性、安全性、性能優化。
不是。8 大基本類型:byte/short/int/long/float/double/char/boolean。String 是 final class,不可繼承,底層 char[](Java 9+ byte[] + coder)。
沒變。String 不可變,+ 編譯為 StringBuilder.append 生成**新對象**,原 "Hello" 留在字符串常量池(或堆),引用 s 指向新對象。
不能。final class String。
1 或 2 個。
常量池無 "xyz" → 2 個(常量池 1 + 堆 1)。
常量池已有 "xyz" → 1 個(僅堆 new)。
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可變性 | 不可變 | 可變 | 可變 |
| 線程安全 | 天然安全 | 同步(鎖) | 非同步 |
| 性能 | 拼接慢 | 較慢 | 最快 |
| 適用場景 | 常量、少量拼接 | 多線程共享緩衝 | 單線程/局部變量大量拼接 |
String[] arr = str.split(","); // 正則,注意轉義 "."
// 或
StringTokenizer st = new StringTokenizer(str, ",");
String[] arr = new String[st.countTokens()];
for (int i=0; st.hasMoreTokens(); i++) arr[i] = st.nextToken();
length **屬性**(無括號)。length() **方法**。size() 方法。執行,在 return 前**執行**(返回值已壓棧,finally 可修改返回值引用對象內容,但不可改變基本類型返回值)。
例外:System.exit()、JVM 崩潰、線程死鎖、CPU 掉電。
final:修飾符(類不可繼承、方法不可覆寫、變量不可改賦值)。finally:異常處理塊,總執行(資源關閉)。finalize():Object 方法,GC 前調用(不保證執行),Java 9 棄用,改用 Cleaner/PhantomReference。RuntimeException 子類):編譯器**不強制**捕獲/拋出聲明,編程錯誤(空指針、越界、類轉換)。try-catch 或 throws,外部環境錯誤(IO、SQL、網絡)。Error:嚴重系統級(OOM、StackOverflow、ClassDefNotFound),**不可恢復**,不應捕獲處理。Exception:程序邏輯可預期/可處理(業務異常、資源異常),應捕獲處理。NullPointerExceptionArrayIndexOutOfBoundsExceptionClassCastExceptionIllegalArgumentExceptionNumberFormatException / ArithmeticExceptiontry:監控區塊。catch:捕獲處理特定異常(多 catch 子類在前)。finally:清理資源(關流、釋放鎖)。throw:拋出異常對象(方法內)。throws:聲明方法拋出畂常(方法簽名)。try 中可 throw,被 catch 捕獲或向上拋出。
extends Thread 重寫 run()。implements Runnable 實現 run(),傳給 new Thread(runnable)(推薦:解耦、可實現多接口、線程池復用)。Callable + FutureTask 可獲取返回值/拋異常。synchronized 修飾方法/代碼塊。stop():強制終止,釋放鎖導致數據不一致(破壞原子性)。suspend():暫停不釋放鎖,極易死鎖(恢復前其他線程無法獲取鎖)。| 特性 | sleep() | wait() |
|---|---|---|
| 所屬類 | Thread (static) | Object |
| 鎖狀態 | **不釋放**鎖 | **釋放**鎖 |
| 喚醒方式 | 時間到自動 | notify/notifyAll/interrupt |
| 調用前提 | 無 | **必須持有對象鎖**(在 synchronized 內) |
start():創建新線程,進入就緒態,JVM 調度執行 run()。
直接調 run():當前線程同步執行,無新線程創建。
this)。wait() 釋放鎖後:**能**。Class.class,與實例方法**互不干擾**。| 維度 | synchronized | Lock (ReentrantLock) |
|---|---|---|
| 釋放鎖 | 自動(塊結束/異常) | 手動 unlock()(必在 finally) |
| 可中斷 | 不可 | lockInterruptibly() |
| 公平鎖 | 非公平 | 可選公平/非公平 |
| 條件變量 | wait/notify | newCondition() 多條件 |
| 嘗試獲取 | 無 | tryLock() 非阻塞 |
| 性能 | JVM 優化優秀(偏向鎖、輕量級鎖) | 高並發顯式控制優勢 |
Collections.synchronizedList 或 CopyOnWriteArrayList。List ✓、Set ✓、Map ✗(Map 獨立體系)。
| 操作 | ArrayList/Vector | LinkedList |
|---|---|---|
| 隨機訪問 get/set | O(1) ✓ | O(n) ✗ |
| 頭尾增刪 | O(1) 擴容均攤 | O(1) ✓ |
| 中間增刪 | O(n) 數組拷貝 | O(n) 遍歷定位 |
| 內存佔用 | 較小(數組) | 較大(節點對象) |
| 特性 | Stack (棧/虛擬機棧) | Heap (堆) |
|---|---|---|
| 存儲內容 | 局部變量、操作數棧、幀數據、方法返回地址 | 對象實例、數組、字符串常量池(1.7+) |
| 生命週期 | 隨線程/方法創建銷毀 | GC 管理,跨方法/線程共享 |
| 異常 | StackOverflowError | OutOfMemoryError |
| 分配速度 | 極快(指針移動) | 較慢(TLAB、CAS、GC) |
垃圾回收:自動識別不可達對象並回收內存。避免手動管理導致的洩漏、野指針、雙重釋放。核心算法:標記-清除、標記-整理、複製、分代收集(新生代/老年代)。
斷言:開發/測試期驗證前置/後置條件/不變式。assert condition : message;。運行需啟用 -ea,生產環境關閉(零開銷)。不可用於公共方法參數檢查(可能被關閉)。
web.xml 監視(development=false)。jsp.precompile、Maven 插件)。-Xms -Xmx)、元空間、線程棧。| 維度 | GET | POST |
|---|---|---|
| 數據位置 | URL 查詢串 | 請求體 |
| 長度限制 | ~2KB (瀏覽器/服務器) | 理論無限 (配置限制) |
| 安全性 | 明文可見、歷史、緩存 | 相對隱蔽 |
| 幂等性 | 是 | 否 |
| 編碼 | URL 編碼 | 多種 (form-data, json, xml) |
| 特性 | forward (請求轉發) | redirect (重定向) |
|---|---|---|
| 過程 | 服務端內部跳轉 | 服務端發 302,瀏覽器再請求 |
| 地址欄 | 不變 | 變為新 URL |
| request 域 | 共享 | 新 request(丟失) |
| 速度 | 快 | 慢(多一次網絡往返) |
| 跨應用 | 不可 | 可 |