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

Java 面試基礎題庫精選:源文件結構、關鍵字、運算符、流程控制、類型系統、集合、並發、JVM、Spring、MySQL

     編輯:Java 程式設計入門

前言

本文精選高頻 Java 面試基礎題,**按知識點分類、附標準答案、核心原理、易錯點、追問延伸**,適合校招、社招系統複習、面試前速查。每題包含:結論、代碼證據、JLS/JVM 規範依據、實戰避坑。

一、語法基礎

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

結論:可以包含多個類,**但最多只能有一個 `public` 類**,且 `public` 類名**必須與文件名完全一致** (大小写敏感)。


// File: Main.java
public class Main { }           // ✅ 唯一 public,同名
class Helper { }                // ✅ package-private
// public class Another { }     // ❌ 編譯錯誤

追問:為什麼? → JVM 類加載器按文件名查找 `public` 類,保證類名唯一映射。

2. Java 有 `goto` 嗎?

結論:`goto` 是**保留關鍵字**,**未使用**、**編譯錯誤**。但字節碼有 `goto` 指令 (編譯器生成)。

3. `&` vs `&&` 區別?

結論:

  • `&`:邏輯與 (雙方均求值) + 位運算 (整數操作數)。
  • `&&`:短路邏輯與,**左側為 false 則右側不求值**。

String s = null;
if (s != null & s.length() > 0)  // NPE! 右側仍執行
if (s != null && s.length() > 0) // 安全,短路

int a = 5 & 3;  // 1 (位運算)
int b = 5 && 3; // 編譯錯誤:&& 需 boolean 操作數

4. `switch` 支援型別?

結論:`switch(expr)` 中 `expr` 僅支援:**`byte/short/char/int` 及其包裝類、`enum`、JDK 7+ `String`**。不支援 `long`、`float`、`double`、`boolean`。

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

結論:`s+1` 觸發**整數提升**為 `int`,賦值回 `short` 需強轉。`+=` 是**複合賦值運算符**,JLS 規定**隱含強轉**:`s += 1` 等價 `s = (short)(s + 1)`。

6. `char` 能存漢字嗎?

結論:能。`char` 是 **UTF-16 代碼單元 (2 bytes)**,BMP 字符 (含常用漢字) 佔 1 `char`;補充字符 (Emoji、生僻字) 佔 2 `char` (代理對)。

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

結論:引用不可變**,對象內容可變**。


final StringBuilder sb = new StringBuilder();
// sb = new StringBuilder(); // ❌ 編譯錯誤
sb.append("hello");           // ✅ 合法,修改對象內容

8. `==` vs `equals()` 核心區別?

結論:

  • `==`:比較**引用地址** (基本型比值、引用型比地址)。
  • `equals()`:比較**邏輯內容** (需類覆寫)。`Object.equals()` 默認同 `==`。

String a = new String("foo");
String b = new String("foo");
a == b          // false (不同對象)
a.equals(b)     // true  (內容相同)

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

結論:

  • 靜態變量:屬於**類**,類加載時分配,**全局唯一**,`ClassName.staticVar` 訪問。
  • 實例變量:屬於**對象**,`new` 時分配,**每個實例一份**,`obj.instanceVar` 訪問。

10. `static` 方法能調用非 `static` 方法嗎?

結論:不能直接調用**。非靜態方法需綁定實例 (`this`),靜態方法無 `this`。可 `new Obj().nonStatic()` 或傳入實例參數。

11. `int` vs `Integer` 區別?

結論:

維度intInteger
類型基本型包裝類 (對象)
默認值0null
記憶體4 bytes (棧/物件內)對象頭 + 4 bytes (堆)
泛型❌✅
快取無[-128,127] `IntegerCache`
Web 表單顯示 0顯示空 (null 安全)

12. 訪問修飾符可見性矩陣?

結論:

修飾符同類同包子類(異包)非子類(異包)
`private`✅❌❌❌
`default` (package)✅✅❌❌
`protected`✅✅✅❌
`public`✅✅✅✅

注意:`protected` 對**同包非子類也可見** (不同於 C++)。

13. Overload vs Override 區別?返回類型能重載嗎?

結論:

  • **Overload (重載)**:同類中,**方法名相同、參數列表不同** (類型/個數/順序)。—— **返回類型、異常、修飾符可不同**。
  • **Override (覆寫)**:子類覆寫父類,**簽名完全相同** (名、參數、返回類型协变)。—— **權限 ≥ 父類、拋出異常 ≤ 父類**。

返回類型 alone 不能重載:調用時不看返回值,編譯器無法區分。

14. `has-a` vs `is-a`?

結論:`is-a` = **繼承** (子類是父類一種);`has-a` = **組合/聚合** (類包含另一類實例)。

15. ClassLoader 加載流程?

結論:**雙親委派模型**:

  1. Bootstrap ClassLoader → `jre/lib/rt.jar` (核心庫)
  2. Extension ClassLoader → `jre/lib/ext/*.jar`
  3. Application ClassLoader → `classpath`
  4. 自定義 ClassLoader → 繼承 `ClassLoader` 重寫 `findClass`

流程:`loadClass` → 檢查已加載 → 委派父加載器 → 父加載失敗 → 自己 `findClass` → `defineClass`。

二、進階核心

16. 分層架構優勢?

結論:解耦、分工、維護、復用、替換 (如 Hibernate→MyBatis)、擴展、適應變化。典型三層:Controller (Web) → Service (Biz) → DAO (Data)。

17. `hashCode()` 作用與契約?

結論:用於**哈希容器** (`HashMap`、`HashSet`) 定位桶位。契約:
1. 同一對象多次調用返回一致。
2. `a.equals(b) → a.hashCode()==b.hashCode()` (反向不要求)。
3. **覆寫 `equals` 必須覆寫 `hashCode`**。

18. AOP 核心概念?

結論:面向切面編程。**切面** = 橫切關注點 (日志、事務、權限)。**切點** = 具體連接點 (方法執行、異常拋出) 的匹配規則。**通知** = 切面在切點執行的動作 (前/後/環繞/異常/最終)。**織入** = 將通知應用到目標對象 (編譯期/類加載期/運行期代理)。

19. MVC 理解?

結論:Model (數據/業務邏輯) ↔ View (展示/交互) ↔ Controller (請求分發/協調)。流程:請求 → Controller → Service/Model → Controller 選 View → View 渲染 Model → 響應。核心:**關注點分離、單一職責、可測試、可替換 View**。

三、集合與並發高頻題

  1. ArrayList vs LinkedList:隨機訪問 O(1) vs O(n);增刪尾部 O(1) vs O(1);記憶體連續 vs 節點分散。
  2. HashMap 擴容機制:負載因子 0.75、閾值 `size > threshold` → 2倍擴容、高位掛鏈/紅黑樹 (JDK 8+)。
  3. ConcurrentHashMap 線程安全:JDK 7 Segment 鎖;JDK 8+ `synchronized` + CAS + `Node` 鏈表/紅黑樹,`size()` 用 `LongAdder`。
  4. volatile 可见性/有序性/非原子性:禁止指令重排、強制刷新主存、不保證 `i++` 原子。
  5. synchronized 鎖升級:偏向鎖 → 輕量級鎖 (CAS) → 重量級鎖 (OS Monitor)。
  6. AQS 框架:`state` + CLH 隊列 + `tryAcquire/tryRelease` 模板,支撐 `ReentrantLock`、`Semaphore`、`CountDownLatch`。
  7. ThreadLocal 記憶體洩漏:`ThreadLocalMap` Key 弱引用,Value 強引用 → 線程池長生命週期導致 Value 洩漏 → `remove()` 清理。

四、JVM 與調優

  1. 運行時數據區:堆 (對象)、棧 (幀)、方法區 (類元數據/常量池)、本地方法棧、PC 寄存器。
  2. GC 算法:標記-清除、標記-整理、複製、分代 (新生代 Eden/S0/S1、老年代)。
  3. 收集器:Serial、Parallel、CMS、G1、ZGC、Shenandoah。
  4. 類加載過程:加載 → 驗證 → 準備 → 解析 → 初始化 → 使用 → 卸載。
  5. 雙親委派打破:Tomcat (WebappClassLoader 先自找)、SPI (`Thread.contextClassLoader`)、熱部署。

五、Spring 生態

  1. IOC 容器啟動:`BeanDefinition` 註冊 → `BeanFactoryPostProcessor` → `BeanPostProcessor` (實例化/屬性注入/初始化/AOP 代理) → 完成。
  2. 事務傳播行為:`REQUIRED` (默認)、`REQUIRES_NEW`、`NESTED`、`SUPPORTS`、`NOT_SUPPORTED`、`NEVER`、`MANDATORY`。
  3. 循環依賴解決:三級緩存 (`singletonObjects`、`earlySingletonObjects`、`singletonFactories`) + `ObjectFactory` 提前暴露代理。
  4. @Transactional 失效場景:非 public、同類內部調用、異常被捕獲未拋出、非 RuntimeException/Error、引擎不支援事務。

六、MySQL 基礎

  1. 索引結構:B+ 樹 (聚簇索引/二級索引)、回表、覆蓋索引、最左前綴、索引下推 (ICP)。
  2. 事務 ACID:原子性 (Undo Log)、一致性 (約束)、隔離性 (MVCC + 鎖)、持久性 (Redo Log)。
  3. 隔離級別:RU、RC、RR (默認)、Serializable。RR 解決幻讀 (Next-Key Lock)。
  4. 鎖類型:記錄鎖、間隙鎖、臨鍵鎖、意向鎖、自增鎖。
  5. Explain 關鍵列:`type` (system/const/eq_ref/ref/range/index/all)、`key`、`rows`、`Extra` (Using index/where/temporary/filesort)。

💡 複習策略:背誦結論 → 手寫代碼驗證 → 畫圖講原理 → 模擬面試追問**。重點掌握:**HashMap/JMM/GC/Spring事務/MySQL索引鎖** 五大核心專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved