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

Java 面試核心題庫精選:基礎語法、集合、並發、JVM、Web 全覆蓋

     編輯:Java 綜合教學

前言:高頻面試題系統梳理

本文精選 Java 面試高頻核心題 70+ 道,涵蓋基礎語法、面向對象、集合框架、異常處理、多線程、JVM、Web 基礎、Servlet/JSP 等模塊。每題給出標準答案要點、底層原理延伸及避坑指南,助力高效備戰。


一、基礎語法與語言特性 (1-10)

1. .java 文件能否包含多個類?限制?

答:可以,但僅允許一個 public 類,且 public 類名必須與文件名完全一致。其他類默認 package-private。

2. Java 有 goto 嗎?

答:goto 是保留字,未使用。可用標號配合 break/continue 實現類似效果:outer: for(...) { inner: for(...) { break outer; } }。

3. & vs && 區別?

  • &:邏輯與(不短路)+ 位與運算。兩側皆為 boolean 時為邏輯與,**總計算右側**。
  • &&:短路邏輯與,**左側 false 直接返回 false,不計算右側**。
  • 經典防空指針:if (str != null && !str.isEmpty())。

4. 跳出多重嵌套循環?

答:外層循環前加標號 label:,內層用 break label; 或 continue label;。

5. switch 作用類型?

  • Java 1.0-6:byte/short/char/int 及包裝類、enum(1.5+)。
  • Java 7+:新增 String。
  • 不支持:long、float、double、boolean。

6. short s1=1; s1=s1+1 錯誤?s1+=1 正確?

  • s1+1 整型提升為 int,賦值回 short 需強轉。
  • += 隱含強轉:s1 = (short)(s1 + 1),編譯器自動處理。

7. char 能存漢字嗎?

答:能。char 存 Unicode 碼點(UTF-16 代碼單元),佔 2 字節。BMP 內漢字直接存儲;補充平面字符(Emoji、罕用字)需 char[2](代理對)或 int 存碼點。

8. 最高效算 2*8?

答:2 << 3(左移 3 位 = 乘 2³)。位運算 CPU 指令級,無函數調用開銷。

9. 設計百億計算器思路?

  • 基本類型溢出上限:long 9e18,BigInteger 理論無上限(內存許可)。
  • 核心:大數分段存儲(數組/鏈表),模擬豎式運算(逐位 + 進位)。
  • 優化:FFT/NTT 快速乘法、Karatsuba 分治乘法、Base 10⁹ 壓縮存儲。

10. final 修飾變量:引用不變 vs 對象不變?

答:引用不可變(不能指向新對象),對象內容可變。
final List<String> list = new ArrayList<>(); list.add("ok"); // 編譯通過
list = new ArrayList<>(); // 編譯錯誤


二、面向對象核心 (11-20)

11. == vs equals()?

  • ==:基本類型比值,引用類型比地址(是否同一對象)。
  • equals():Object 默認比地址;String/包裝類/集合類重寫比內容。業務類需自行重寫並遵守對稱、傳遞、一致性契約。

12. 靜態變量 vs 實例變量?

  • 靜態:屬於類,類加載時分配(方法區/元空間),ClassName.field 訪問,全局共享。
  • 實例:屬於對象,new 時在堆分配,obj.field 訪問,各對象獨立副本。

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

不能。靜態方法屬於類,調用時可能無實例對象;非靜態方法需綁定 this 實例。反之可行(實例方法可調用靜態方法)。

14. Integer vs int?

維度intInteger
類型基本類型包裝類(引用類型)
默認值0null
泛型支持無可作類型參數
緩存池無-128~127 自動緩存(valueOf)
NPE 風險無自動拆箱可能拋 NPE

15. Math.round(-11.5) 結果?

算法:floor(x + 0.5)。
round(11.5) = floor(12.0) = 12
round(-11.5) = floor(-11.0) = -11(注意:負數向零方向取整)。

16. 四大訪問修飾符範圍?

修飾符同類同包子類(異包)異包無關類
public✓✓✓✓
protected✓✓✓✗
default✓✓✗✗
private✓✗✗✗

17. Overload vs Override?

  • Overload(重載):同類中,方法名同,**參數列表不同**(個數/類型/順序),返回類型可異,修飾符無關。編譯期綁定(靜態)。
  • Override(重寫):子父類間,方法簽名**完全相同**,返回類型协变(子類型)、拋出異常子集、訪問權限不小於父類。運行期動態綁定(多態)。

18. 構造器能 Override 嗎?

不能。構造器不參與繼承,無法重寫。但可 Overload(重載) 多個構造器。

19. 接口繼承/實現規則?

  • 接口可 extends 多個接口。
  • 抽象類可 implements 接口(可不實現方法,留給子類)。
  • 抽象類可 extends 具體類(前提父類有可見構造器)。
  • 抽象類可有 static main 方法(屬於類,不需實例)。

20. clone() 首行通常?

super.clone()。先複製父類字段,再處理自身深拷貝需求。需實現 Cloneable 否則拋 CloneNotSupportedException。


三、集合框架精華 (21-35)

21. 多態實現機制?

父類引用指向子類對象(向上造型),方法調用根據**運行時對象實際類型**動態分派(JVM invokevirtual 指令查虛表),而非引用聲明類型。

22. abstract class vs interface?

特性abstract classinterface
構造器可有不可有(Java 8 前)
字段任意默認 public static final
方法可有非抽象方法Java 8 前全抽象;8+ 可 default/static/private
訪問權限任意方法默認 public
繼承/實現單繼承多實現
靜態方法可有Java 8+ 支持

23. abstract 方法能配合 static/native/synchronized?

  • static:不可。靜態屬類,抽象需子類實現,邏輯衝突。
  • native:不可。native 表示外部實現,無抽象必要。
  • synchronized:不可。同步鎖為 this,抽象方法無實體無法確定鎖對象。

24. 內部類分類與靜態區別?

  • Static Nested Class:static class Inner,無外部類實例引用,只能訪問外部靜態成員,獨立存在。
  • Inner Class (非靜態):隱持 Outer.this 引用,可訪問外部所有成員(含私有),需 new Outer().new Inner() 創建。
  • 局部內部類:方法/塊內定義,可訪問 final/effectively final 局部變量。
  • 匿名內部類:無名、單用、繼承類/實現接口,大量用於回調、事件監聽。

25. 內部類訪問外部成員限制?

非靜態內部類:無限制(含私有)。靜態內部類:僅靜態成員。局部/匿名:僅 final/effectively final 局部變量。

26. 匿名內部類能 extends/implements?

必須:new SuperType() { ... } 或 new Interface() { ... },隱式繼承/實現,不可顯式寫關鍵字。

27. JDK 中 final 類不可繼承?

String、StringBuffer、StringBuilder、System、Math、包裝類、Enum 等。設計意圖:不可變性、安全性、性能優化。

28. String 是基本類型嗎?

不是。8 大基本類型:byte/short/int/long/float/double/char/boolean。String 是 final class,不可繼承,底層 char[](Java 9+ byte[] + coder)。

29. String s="Hello"; s+="world" 原對象變了嗎?

沒變。String 不可變,+ 編譯為 StringBuilder.append 生成**新對象**,原 "Hello" 留在字符串常量池(或堆),引用 s 指向新對象。

30. 能繼承 String 嗎?

不能。final class String。

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

1 或 2 個。
常量池無 "xyz" → 2 個(常量池 1 + 堆 1)。
常量池已有 "xyz" → 1 個(僅堆 new)。

32. String vs StringBuffer vs StringBuilder?

特性StringStringBufferStringBuilder
可變性不可變可變可變
線程安全天然安全同步(鎖)非同步
性能拼接慢較慢最快
適用場景常量、少量拼接多線程共享緩衝單線程/局部變量大量拼接

33. 逗號分割字符串轉數組?


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();

34. 數組有 length() 嗎?String 有 length() 嗎?

  • 數組:length **屬性**(無括號)。
  • String:length() **方法**。
  • 集合:size() 方法。

35. try 有 return,finally 執行嗎?何時?

執行,在 return 前**執行**(返回值已壓棧,finally 可修改返回值引用對象內容,但不可改變基本類型返回值)。
例外:System.exit()、JVM 崩潰、線程死鎖、CPU 掉電。


四、異常與錯誤 (36-41)

36. final / finally / finalize?

  • final:修飾符(類不可繼承、方法不可覆寫、變量不可改賦值)。
  • finally:異常處理塊,總執行(資源關閉)。
  • finalize():Object 方法,GC 前調用(不保證執行),Java 9 棄用,改用 Cleaner/PhantomReference。

37. 運行時異常 vs 受檢異常?

  • 運行時異常(RuntimeException 子類):編譯器**不強制**捕獲/拋出聲明,編程錯誤(空指針、越界、類轉換)。
  • 受檢異常:編譯器**強制** try-catch 或 throws,外部環境錯誤(IO、SQL、網絡)。

38. Error vs Exception?

  • Error:嚴重系統級(OOM、StackOverflow、ClassDefNotFound),**不可恢復**,不應捕獲處理。
  • Exception:程序邏輯可預期/可處理(業務異常、資源異常),應捕獲處理。

39. 常見 5 個 RuntimeException?

  1. NullPointerException
  2. ArrayIndexOutOfBoundsException
  3. ClassCastException
  4. IllegalArgumentException
  5. NumberFormatException / ArithmeticException

40. 異常處理關鍵字職責?

  • try:監控區塊。
  • catch:捕獲處理特定異常(多 catch 子類在前)。
  • finally:清理資源(關流、釋放鎖)。
  • throw:拋出異常對象(方法內)。
  • throws:聲明方法拋出畂常(方法簽名)。

try 中可 throw,被 catch 捕獲或向上拋出。


五、多線程與並發 (41-48)

41. 實現線程兩種方式?

  1. extends Thread 重寫 run()。
  2. implements Runnable 實現 run(),傳給 new Thread(runnable)(推薦:解耦、可實現多接口、線程池復用)。
  3. 補充:Callable + FutureTask 可獲取返回值/拋異常。

42. 同步關鍵字?stop/suspend 為何棄用?

  • synchronized 修飾方法/代碼塊。
  • stop():強制終止,釋放鎖導致數據不一致(破壞原子性)。
  • suspend():暫停不釋放鎖,極易死鎖(恢復前其他線程無法獲取鎖)。

43. sleep() vs wait()?

特性sleep()wait()
所屬類Thread (static)Object
鎖狀態**不釋放**鎖**釋放**鎖
喚醒方式時間到自動notify/notifyAll/interrupt
調用前提無**必須持有對象鎖**(在 synchronized 內)

44. 同步 vs 異步場景?

  • 同步:共享數據訪問、短耗時操作、順序依賴、簡單直觀。
  • 異步:耗時 IO(網絡、磁盤)、長計算、事件驅動、提高吞吐/響應、解耦生產消費。

45. 啟動線程 run() 還是 start()?

start():創建新線程,進入就緒態,JVM 調度執行 run()。
直接調 run():當前線程同步執行,無新線程創建。

46. synchronized 方法執行時,其他線程能進入同對象其他方法?

  1. 非 synchronized 方法:**能**(無鎖競爭)。
  2. 其他 synchronized 實例方法:**不能**(同一把鎖 this)。
  3. 調用 wait() 釋放鎖後:**能**。
  4. 靜態 synchronized 方法:鎖為 Class.class,與實例方法**互不干擾**。

47. synchronized vs Lock?

維度synchronizedLock (ReentrantLock)
釋放鎖自動(塊結束/異常)手動 unlock()(必在 finally)
可中斷不可lockInterruptibly()
公平鎖非公平可選公平/非公平
條件變量wait/notifynewCondition() 多條件
嘗試獲取無tryLock() 非阻塞
性能JVM 優化優秀(偏向鎖、輕量級鎖)高並發顯式控制優勢

48. ArrayList vs Vector?

  • 同步性:Vector 同步,ArrayList 非同步。
  • 擴容:Vector 2 倍,ArrayList 1.5 倍。
  • 性能:ArrayList 優,單線程首選;多線程用 Collections.synchronizedList 或 CopyOnWriteArrayList。

六、Map 體系 (49-53)

49. HashMap vs Hashtable?

  • 歷史:Hashtable 1.0 (Dictionary 子類),HashMap 1.2 (Map 實現)。
  • 同步:Hashtable 同步,HashMap 非同步。
  • Null:HashMap 允許 1 null key + 多 null value;Hashtable 全禁 null。
  • 迭代器:HashMap fail-fast,Hashtable enumerator 不 fail-fast。
  • 初始容量:Hashtable 11/2n+1,HashMap 16/2n(冪次)。

50. List vs Map?

  • List:單列、有序、可重複、索引訪問。
  • Map:雙列、鍵唯一、值可重複、鍵值映射、無序(HashMap)/有序。

51. List/Set/Map 繼承 Collection?

List ✓、Set ✓、Map ✗(Map 獨立體系)。

52. List/Set/Map 存取特點?

  • List:有序、可重複、索引快 O(1)。
  • Set:無序(HashSet)、唯一(equals 判斷)、查找快 O(1)。
  • Map:Key 唯一、Value 可重複、Key-Value 映射查找 O(1)。

53. ArrayList/Vector/LinkedList 性能?


七、工具類與 IO (54-59)

54. Collection vs Collections?

  • Collection:頂層接口(子接口 List/Set/Queue)。
  • Collections:工具類(靜態方法:排序、二分查找、同步包裝、不可修改視圖、空集合、頻率統計)。

55. Set 判重用 == 還是 equals()?

equals()。HashSet 先 hashCode() 定桶,再 equals() 精確比較。== 比地址,無法識別內容相等的不同對象。

56. equals(true) 但 hashCode 不同,對嗎?

錯。違反契約,導致 HashSet/HashMap 失效(同一對象落入不同桶,找不到/重複存儲)。

57. 常用類/包/接口各舉 5 個?

  • 類:String、ArrayList、HashMap、Thread、Date。
  • 包:java.lang、java.util、java.io、java.sql、javax.servlet。
  • 接口:Runnable、List、Map、Serializable、Comparator。

58. Java 流分類與頂層抽象類?

  • 字節流:InputStream、OutputStream。
  • 字符流:Reader、Writer。
  • 轉換橋樑:InputStreamReader、OutputStreamWriter(編碼指定)。

59. Java 序列化與 Serializable?

  • 對象 → 位元組流(持久化/網絡傳輸/RMI)。
  • 實現 Serializable 標記接口(無方法),serialVersionUID 版本控制。
  • transient 跳過字段,Externalizable 自定義協議。

八、JVM 與 類加載 (60-63)

60. JVM 加載 class 機制?

雙親委派模型:Bootstrap → Extension → Application → Custom。
階段:加載(獲取二進制流→生成 Class 對象)→ 驗證 → 準備(靜態變量賦默認值)→ 解析(符號引用→直接引用)→ 初始化(<clinit> 賦值/靜態塊) → 使用 → 卸載。

61. Heap vs Stack?

操作ArrayList/VectorLinkedList
隨機訪問 get/setO(1) ✓O(n) ✗
頭尾增刪O(1) 擴容均攤O(1) ✓
中間增刪O(n) 數組拷貝O(n) 遍歷定位
內存佔用較小(數組)較大(節點對象)
特性Stack (棧/虛擬機棧)Heap (堆)
存儲內容局部變量、操作數棧、幀數據、方法返回地址對象實例、數組、字符串常量池(1.7+)
生命週期隨線程/方法創建銷毀GC 管理,跨方法/線程共享
異常StackOverflowErrorOutOfMemoryError
分配速度極快(指針移動)較慢(TLAB、CAS、GC)

62. GC 是什麼?為何需要?

垃圾回收:自動識別不可達對象並回收內存。避免手動管理導致的洩漏、野指針、雙重釋放。核心算法:標記-清除、標記-整理、複製、分代收集(新生代/老年代)。

63. assert 用途?

斷言:開發/測試期驗證前置/後置條件/不變式。assert condition : message;。運行需啟用 -ea,生產環境關閉(零開銷)。不可用於公共方法參數檢查(可能被關閉)。


九、Web 基礎與 Servlet/JSP (64-72)

64. Tomcat 優化?

  • 關閉 web.xml 監視(development=false)。
  • JSP 預編譯為 Servlet(jsp.precompile、Maven 插件)。
  • 調大 JVM 堆(-Xms -Xmx)、元空間、線程棧。
  • 連接池調優、NIO/APR 連接器、壓縮/緩存/靜態資源分離。

65. HTTP GET vs POST?

66. Servlet 是什麼?

運行在容器中的 Java 組件,實現 javax.servlet.Servlet 接口,生命週期:init() → service(req,resp) → destroy()。容器管理實例化、多線程分發。

67. Servlet 生命週期?

  1. 加載實例化(首次請求或啟動 load-on-startup)。
  2. init(ServletConfig) 初始化(一次)。
  3. service() 分發 doGet/doPost...(每請求一線程)。
  4. destroy() 銷毀(容器關閉/重新部署)。

68. forward vs redirect?

維度GETPOST
數據位置URL 查詢串請求體
長度限制~2KB (瀏覽器/服務器)理論無限 (配置限制)
安全性明文可見、歷史、緩存相對隱蔽
幂等性是否
編碼URL 編碼多種 (form-data, json, xml)

69. doGet/doPost 觸發條件?

<form method="get"> → doGet();method="post" → doPost()。無 method 默認 GET。

70. JSP 9 大內置對象?

  1. request (HttpServletRequest)
  2. response (HttpServletResponse)
  3. session (HttpSession)
  4. application (ServletContext)
  5. out (JspWriter)
  6. pageContext (PageContext)
  7. config (ServletConfig)
  8. page (this, Servlet 實例)
  9. exception (Throwable, 僅錯誤頁 isErrorPage=true)

71. JSP 6 大動作指令?

  1. jsp:include 動態包含(請求時合並)。
  2. jsp:forward 轉發。
  3. jsp:useBean 尋找/實例化 Bean。
  4. jsp:setProperty 設置屬性。
  5. jsp:getProperty 輸出屬性。
  6. jsp:plugin 生成 Applet/Object 標籤(已廢棄)。

72. 動態 include vs 靜態 include?

  • 動態:<jsp:include page="...">,請求時編譯合並,**可傳參數**,適合動態頁。
  • 靜態:<%@ include file="..." %>,編譯期文本合並,**無法傳參**,適合靜態片段(頭尾模板)。

十、備戰建議

  1. 原理優於背誦:掌握 HashMap 擴容、ThreadLocal 洩漏、JVM 內存模型、類加載雙親委派等核心機制。
  2. 手寫代碼:單例模式、生產消費者、LRU Cache、死鎖演示、線程池參數配置。
  3. 項目難點拆解:高併發如何限流、分布式事務方案、緩存一致性、數據庫優化實戰。
  4. 新特性跟進:Java 8-21 Stream、Optional、Record、Sealed Class、Virtual Thread、Pattern Matching。
  5. 系統設計視角:從單機到微服務,CAP/BASE、一致性協議、熔斷降級、鏈路追蹤。

面試不僅考知識點,更考察**工程思維、問題拆解、權衡取捨**。祝你 Offer 滿滿!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性forward (請求轉發)redirect (重定向)
過程服務端內部跳轉服務端發 302,瀏覽器再請求
地址欄不變變為新 URL
request 域共享新 request(丟失)
速度快慢(多一次網絡往返)
跨應用不可可