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

Java 面試題精選 50 題:基礎核心、集合、併發、JVM、異常處理與設計模式全覆蓋

     編輯:Java 程式設計入門

本文精選 50 道高頻 Java 面試題,涵蓋基礎語法、集合框架、併發編程、JVM 內存模型、異常處理、設計模式等核心領域,每題附帶標準答案、深度解析與避坑指南,助你高效備戰大廠面試。

第一部分:Java 基礎核心 (1-15)

1. 面向對象三大特徵?

封裝:隱藏內部實現,暴露公共介面(如私有字段 + 公共 getter/setter)
繼承:子類複用父類代碼,構建 is-a 層級(單繼承)
多態:同一介面多種實現,編譯期重載 + 運行期重寫

2. 訪問修飾符作用域表

修飾符同類同包子類其他
public✓✓✓✓
protected✓✓✓✗
default✓✓✗✗
private✓✗✗✗

3. String 是基本類型嗎?

不是。基本類型 8 個:byte/short/int/long/float/double/char/boolean。String 是最終類,不可變對象。

4. float f = 3.4 編譯錯誤原因?

3.4 是 double 常數,窄化轉換需強轉:float f = 3.4f 或 (float)3.4。

5. short s=1; s=s+1 錯誤 vs s+=1 正確?

s+1 提升為 int 運算,賦值需強轉;s+=1 隱含強轉 (short)(s+1)。

6. Java 有 goto 嗎?

保留字,未實現。可用標籤 break/continue 替代極少數場景。

7. int vs Integer 區別?

int 基本類型(4字節,預設0);Integer 包裝類(對象,預設null)。JDK 1.5+ 自動裝箱/拆箱。快取陷阱:-128~127 共享對象。

8. & vs && 區別?

& 邏輯與/位與,雙邊必算;&& 短路與,左偽右不算。防 NPE 必用 &&。

9. 棧、堆、方法區存什麼?

  • 棧:基本類型變量、對象引用、方法幀
  • 堆:new 出來的對象、陣列
  • 方法區:類信息、常量、靜態變量、JIT 編譯代碼

String s = new String("abc"):s在棧,對象在堆,"abc"在常量池(方法區)。

10. Math.round(-11.5) = ?

-11。原理:參數 +0.5 後向下取整。floor(-11.5+0.5) = floor(-11) = -11。

11. switch 支援類型演進

JDK 1.4-:byte/short/char/int
JDK 1.5+:enum
JDK 1.7+:String
不支援:long, float, double, boolean

12. 2*8 最高效寫法?

2 << 3(左移 3 位 = 乘 2³)。hashCode 中 31 * n = (n << 5) - n 同理。

13. 陣列 length vs String length()

陣列:length 屬性;String/集合:length()/size() 方法。

14. 跳出多重循環?

標籤 outer: for(...) { inner: for(...) { break outer; } }。建議提取方法 return 替代。

15. 構造器可被重寫嗎?

不能。構造器非繼承成員,可重載。子類構造器隱含/顯式調用 super()。

第二部分:核心 API 與記憶體 (16-30)

16. equals/hashCode 契約

equals(true) → hashCode 必相等;hashCode 相等 → equals 不一定 true。違反導致 HashMap/HashSet 失效。

17. String 可被繼承嗎?

final 類,不可繼承。復用用組合(HAS-A)非繼承(IS-A)。

18. Java 參數傳遞:值傳遞鐵律

基本類型傳值拷貝;引用類型傳引用地址拷貝。方法內可改對象內容,不可讓外部引用指向新對象。

19. String/StringBuilder/StringBuffer

類線程安全效能場景
String不可變拼接產生新對象常量、少量拼接
StringBuffer同步方法低多線程拼接(少用)
StringBuilder非同步高單線程/高頻拼接

20. 重載 vs 重寫

  • 重載:同類中,同名不同參數列表(類型/個數/順序),與返回類型無關
  • 重寫:父子類中,同名同參數同返回類型(協變),拋出異常⊆父類,訪問權限≥父類

21. 類加載機制:雙親委派模型

  1. Bootstrap ClassLoader (rt.jar)
  2. Extension ClassLoader (ext 目錄)
  3. Application ClassLoader (classpath)
  4. 自定義 ClassLoader

流程:向上委派找不到 → 向下自行加載。打破雙親委派:Tomcat、OSGi、熱部署。

22. char 能存漢字嗎?

能。Java 內部用 UTF-16 (char 2字節),BMP 字符直接存儲,輔助平面需 surrogate pair (兩個 char)。

23. 抽象類 vs 介面 (見 133467 詳細)

24. 靜態內部類 vs 內部類

靜態內部類無外部引用,可獨立實例化;內部類持有外部引用,需 outer.new Inner()。

25. Java 有內存洩漏嗎?

有。無用但可達對象:集合未清理、監聽器未移除、ThreadLocal 未 remove、緩存無過期策略。如 Stack.pop() 未置 null 導致過期引用。

26. abstract 方法能加 static/native/synchronized?

都不能。abstract 需子類實現,static 屬類、native 屬本地實現、synchronized 需方法體,邏輯互斥。

27. 靜態變量 vs 實例變量

static:類級,一份拷貝,類加載初始化;instance:對象級,每對象一份,構造器初始化。

28. static 方法能調用非 static 方法嗎?

不能。static 方法無 this 引用,非 static 方法依賴 this。

29. 對象克隆兩種方式

  1. 實現 Cloneable + 重寫 clone()(淺拷貝,需手動深拷貝)
  2. 實現 Serializable + 序列化反序列化(真深拷貝,編譯期檢查,效能較低)

30. GC 核心:分代收集

  • 新生代:Eden + S0 + S1 (Minor GC,複製算法)
  • 老年代:長期存活對象 (Major GC,標記整理)
  • 元空間:類元數據 (JDK 8+ 替代永久代)

參數:-Xms/Xmx 堆大小,-Xmn 新生代,-XX:+PrintGCDetails。

第三部分:併發、異常、設計模式 (31-50)

31. String s = new String("xyz") 創建幾個對象?

兩個:常量池 "xyz" + 堆 new String。String s = "xyz" 僅常量池 1 個。

32. 介面繼承介面/抽象類實現介面/抽象類繼承具體類

介面可 extends 多介面;抽象類可 implements 介面;抽象類可 extends 具體類(具體類需有構造器)。

33. .java 文件可含多個類嗎?

可,但僅一個 public 類,文件名必須與 public 類同名。

34. 匿名內部類可繼承類/實現介面嗎?

可。Swing 事件監聽常用:new MouseAdapter() { ... }。

35. 內部類可訪問外部 private 成員嗎?

可。編譯器生成包訪問權限存取方法 access$0()。

36. final 關鍵字三大用法

修飾類(不可繼承)、方法(不可重寫)、變量(不可改變引用/值)。

37. 靜態塊/構造器執行順序題

父類靜態 → 子類靜態 → 父構造器 → 子構造器。輸出:1a2b2b。

38. 字符串與基本類型轉換

String→基本:Integer.parseInt()、Double.valueOf()
基本→String:String.valueOf()、+""、toString()

39. 字符串反轉遞歸實現

String reverse(String s) {
    return s.length() <= 1 ? s : reverse(s.substring(1)) + s.charAt(0);
}

40. GB2312 轉 ISO-8859-1

new String(s.getBytes("GB2312"), "ISO-8859-1")。注意:ISO-8859-1 不支援中文,會丟失信息。

41-42. 日期時間 API (Calendar/Date/SimpleDateFormat)

JDK 8+ 強烈推薦 java.time.* (LocalDateTime, DateTimeFormatter, ZoneId) 替代舊 API。

43. Java vs JavaScript

完全不同語言。Java:靜態、編譯、JVM、強類型、面向對象。JS:動態、解釋、瀏覽器/Node、弱類型、原型鏈、函數式。

44. assert 斷言用法

開發/測試開啟 -ea,生產關閉。assert expr : msg。不用於 public 方法參數校驗。

45. Error vs Exception

Error:JVM 級不可恢復 (OOM, StackOverflow);Exception:程序邏輯/環境可處理。受檢 vs 非受檢見 133463。

46. try-return-finally 執行順序

finally 在 return 返回調用者之前執行。finally 可修改返回值(惡習,C# 禁止)。

47. 異常處理 5 關鍵字

try(監控塊) catch(捕獲) throw(拋出) throws(聲明) finally(保證執行)。

48. 運行時異常 vs 受檢異常處理原則

可恢復用受檢,編程錯誤用運行時。Effective Java 7 原則見 133463。

49. 常見運行時異常

NPE、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、ArithmeticException、SecurityException。

50. final/finally/finalize

  • final:修飾符(不可變)
  • finally:塊(保證執行)
  • finalize:Object 方法(GC 前調用,JDK 9+ 棄用,用 Cleaner/PhantomReference)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved