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

15 道經典 Java 面試題深度解析:從基礎語法到併發陷阱

     編輯:Java 相關知識

題目與核心考點速覽

#考點關鍵結論
1字符串常量池與 new Stringstr1 == str2 → false(堆對象 vs 常量池)
2整數溢出Integer.MAX_VALUE + 1 → Integer.MIN_VALUE,滿足 (i+1)<i
3GC 線程屬性GC 是 Daemon 線程,非用戶線程
4volatile 不保證原子性100 萬循環 × 10 線程,count 遠小於 1000 萬
5ArrayList 擴容機制初始容量 20,添加 1 元素不觸發 grow
6BufferedReader 構造器參數只接受 Reader,FileInputStream 需轉換
7異常捕獲順序子類異常需放前面,否則被父類捕獲
8局部變量未初始化編譯錯誤:variable might not have been initialized
9字符串拼接優先級"5" + 2 → "52"(字符串連接)
10switch 穿透特性無 break 導致 case 2、3 連續執行,result=10
11靜態方法可通過 null 調用編譯期綁定,((Null)null).hello() 正常輸出
12值傳遞:String 不可變方法內修改參數引用不影響外部,輸出 "good"
13值傳遞:數組引用可修改內容方法內 ch[0]='g' 影響外部,輸出 "gbc"
14for 循環執行順序輸出:A B D C B D C B D
15類初始化順序靜態塊 → 父非靜態塊 → 父構造器 → 子非靜態塊 → 子構造器

重點題目深度解析

第 4 題:volatile 為什麼不保證原子性?

private static volatile int count = 0;
// 10 線程各自增 100 萬
// count++ 非原子:讀取-修改-寫入 三步操作
// volatile 僅保證 可見性 + 有序性,不保證 原子性
// 正確做法:AtomicInteger / LongAdder / synchronized

第 14 題:for 循環執行流程圖解

for (foo('A'); foo('B') && (i<2); foo('C')) {
    i++;
    foo('D');
}
// 執行順序:
// 1. foo('A') → true
// 2. foo('B') → true, i=0<2 → 進入循環體
// 3. i++ → 1, foo('D')
// 4. foo('C') → true
// 5. foo('B') → true, i=1<2 → 進入循環體
// 6. i++ → 2, foo('D')
// 7. foo('C') → true
// 8. foo('B') → true, i=2<2 false → 結束
// 輸出:A B D C B D C B D

第 15 題:類加載初始化順序口訣

「靜態優先,父先子後;塊後構造,逐層遞歸。」

static A → static B → I'm A class → HelloA → I'm B class → HelloB
// 兩次 new HelloB() 只觸發非靜態部分

面試應對策略

  1. 手寫代碼驗證:遇到不確定題目,現場寫最小復現 Demo。
  2. 說出原理:不僅給答案,要講清「為什麼」(JLS、JVM Spec、源碼)。
  3. 舉一反三:如第 4 題引申到 LongAdder 原理、CAS、偽共享。
  4. 避免陷阱:基本類型 vs 包裝類、字符串常量池、異常捕獲順序、switch 穿透、for 循環三部分執行順序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved