本文精選 50 道高頻 Java 面試題,涵蓋基礎語法、集合框架、併發編程、JVM 內存模型、異常處理、設計模式等核心領域,每題附帶標準答案、深度解析與避坑指南,助你高效備戰大廠面試。
封裝:隱藏內部實現,暴露公共介面(如私有字段 + 公共 getter/setter)
繼承:子類複用父類代碼,構建 is-a 層級(單繼承)
多態:同一介面多種實現,編譯期重載 + 運行期重寫
| 修飾符 | 同類 | 同包 | 子類 | 其他 |
|---|---|---|---|---|
| public | ✓ | ✓ | ✓ | ✓ |
| protected | ✓ | ✓ | ✓ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| private | ✓ | ✗ | ✗ | ✗ |
不是。基本類型 8 個:byte/short/int/long/float/double/char/boolean。String 是最終類,不可變對象。
3.4 是 double 常數,窄化轉換需強轉:float f = 3.4f 或 (float)3.4。
s+1 提升為 int 運算,賦值需強轉;s+=1 隱含強轉 (short)(s+1)。
保留字,未實現。可用標籤 break/continue 替代極少數場景。
int 基本類型(4字節,預設0);Integer 包裝類(對象,預設null)。JDK 1.5+ 自動裝箱/拆箱。快取陷阱:-128~127 共享對象。
& 邏輯與/位與,雙邊必算;&& 短路與,左偽右不算。防 NPE 必用 &&。
String s = new String("abc"):s在棧,對象在堆,"abc"在常量池(方法區)。
-11。原理:參數 +0.5 後向下取整。floor(-11.5+0.5) = floor(-11) = -11。
JDK 1.4-:byte/short/char/int
JDK 1.5+:enum
JDK 1.7+:String
不支援:long, float, double, boolean
2 << 3(左移 3 位 = 乘 2³)。hashCode 中 31 * n = (n << 5) - n 同理。
陣列:length 屬性;String/集合:length()/size() 方法。
標籤 outer: for(...) { inner: for(...) { break outer; } }。建議提取方法 return 替代。
不能。構造器非繼承成員,可重載。子類構造器隱含/顯式調用 super()。
equals(true) → hashCode 必相等;hashCode 相等 → equals 不一定 true。違反導致 HashMap/HashSet 失效。
final 類,不可繼承。復用用組合(HAS-A)非繼承(IS-A)。
基本類型傳值拷貝;引用類型傳引用地址拷貝。方法內可改對象內容,不可讓外部引用指向新對象。
| 類 | 線程安全 | 效能 | 場景 |
|---|---|---|---|
| String | 不可變 | 拼接產生新對象 | 常量、少量拼接 |
| StringBuffer | 同步方法 | 低 | 多線程拼接(少用) |
| StringBuilder | 非同步 | 高 | 單線程/高頻拼接 |
流程:向上委派找不到 → 向下自行加載。打破雙親委派:Tomcat、OSGi、熱部署。
能。Java 內部用 UTF-16 (char 2字節),BMP 字符直接存儲,輔助平面需 surrogate pair (兩個 char)。
靜態內部類無外部引用,可獨立實例化;內部類持有外部引用,需 outer.new Inner()。
有。無用但可達對象:集合未清理、監聽器未移除、ThreadLocal 未 remove、緩存無過期策略。如 Stack.pop() 未置 null 導致過期引用。
都不能。abstract 需子類實現,static 屬類、native 屬本地實現、synchronized 需方法體,邏輯互斥。
static:類級,一份拷貝,類加載初始化;instance:對象級,每對象一份,構造器初始化。
不能。static 方法無 this 引用,非 static 方法依賴 this。
參數:-Xms/Xmx 堆大小,-Xmn 新生代,-XX:+PrintGCDetails。
兩個:常量池 "xyz" + 堆 new String。String s = "xyz" 僅常量池 1 個。
介面可 extends 多介面;抽象類可 implements 介面;抽象類可 extends 具體類(具體類需有構造器)。
可,但僅一個 public 類,文件名必須與 public 類同名。
可。Swing 事件監聽常用:new MouseAdapter() { ... }。
可。編譯器生成包訪問權限存取方法 access$0()。
修飾類(不可繼承)、方法(不可重寫)、變量(不可改變引用/值)。
父類靜態 → 子類靜態 → 父構造器 → 子構造器。輸出:1a2b2b。
String→基本:Integer.parseInt()、Double.valueOf()
基本→String:String.valueOf()、+""、toString()
String reverse(String s) {
return s.length() <= 1 ? s : reverse(s.substring(1)) + s.charAt(0);
}
new String(s.getBytes("GB2312"), "ISO-8859-1")。注意:ISO-8859-1 不支援中文,會丟失信息。
JDK 8+ 強烈推薦 java.time.* (LocalDateTime, DateTimeFormatter, ZoneId) 替代舊 API。
完全不同語言。Java:靜態、編譯、JVM、強類型、面向對象。JS:動態、解釋、瀏覽器/Node、弱類型、原型鏈、函數式。
開發/測試開啟 -ea,生產關閉。assert expr : msg。不用於 public 方法參數校驗。
Error:JVM 級不可恢復 (OOM, StackOverflow);Exception:程序邏輯/環境可處理。受檢 vs 非受檢見 133463。
finally 在 return 返回調用者之前執行。finally 可修改返回值(惡習,C# 禁止)。
try(監控塊) catch(捕獲) throw(拋出) throws(聲明) finally(保證執行)。
可恢復用受檢,編程錯誤用運行時。Effective Java 7 原則見 133463。
NPE、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、ArithmeticException、SecurityException。