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

Core Java 面試題精選 (1-33):從 JVM 基礎到 Java 8 新特性深度解析

     編輯:Java 綜合教學

前言

本文譯自 JournalDev Core Java Interview Q&A,精選 33 道高頻面試題,覆蓋 JVM 架構、基礎語法、集合、並發、Java 8 新特性等核心知識點,附帶深度解析與避坑指南。


Q1: Java 8 有哪些重要新特性?

答:四大支柱 ——

  1. 接口默認/靜態方法:default/static 打破接口不能有實現的限制,支持向後兼容擴展。
  2. Lambda 表達式與函數式接口:@FunctionalInterface,行為參數化,代碼更簡潔。
  3. Stream API:Collection.stream(),聲明式數據處理,支持並行流。
  4. 新日期時間 API:java.time.*,線程安全、不可變、領域驅動設計。

加分點:提及 Optional、CompletableFuture、Nashorn JS 引擎、Base64 內置支持、StringJoiner。


Q2: 如何理解 Java 的平台無關性?

答:一次編寫,到處運行。Java 源碼編譯為字節碼,由特定平台的 JVM 解釋/編譯執行。同樣的 .class 文件可在 Windows/Linux/macOS 上無修改運行。


Q3: 什麼是 JVM?它是否平台無關?

答:JVM 是 Java 虛擬機,負責將字節碼轉為機器碼執行。JVM 本身平台相關(不同 OS 有不同實現),但它屏蔽了底層差異,提供統一運行接口。可通過 -Xms/-Xmx 調優內存。


Q4: JDK vs JVM vs JRE 區別

組件包含用途
JDKJRE + 編譯/調試工具開發
JREJVM + 核心類庫運行
JVM解釋器、JIT、GC、類加載器等執行字節碼

Q5: 所有類的超類是?

答:java.lang.Object,隱式繼承,提供 equals/hashCode/toString/clone/finalize/wait/notify 等通用方法。


Q6: 為什麼 Java 不支持多重繼承?

答:菱形繼承問題。若 A、B 繼承 C 並覆寫同一方法,D 繼承 A、B 時編譯器無法決定調用哪個。接口支持多繼承,因接口只有聲明無實現(Java 8 前),無衝突;Java 8 默認方法引入衝突時需顯式 super 調用或重寫。


Q7: 為什麼 Java 不是純面向對象語言?

答:存在8 種基本類型(int/long/double...),非對象。雖有包裝類,但基本類型為性能保留(無對象頭、無 GC 壓力、棧上分配)。


Q8: path vs classpath

path:OS 環境變量,定位可執行程序(java.exe、javac.exe)。
classpath:JVM 參數,定位類文件(.class、.jar、目錄),運行時使用。


Q9: main 方法簽名解析

public static void main(String[] args)
  • public:JVM 外部調用入口
  • static:無需實例化類即可調用
  • void:無返回值
  • String[] args:命令行參數數組

Q10: 重載 vs 覆蓋

重載覆蓋
關係同一類/父子類父子類
方法名相同相同
參數列表不同相同
返回類型可不同兼容/相同
異常無限制子類異常 ≤ 父類
註解無@Override

Q11: 可否重載 main?

答:可。類可有多個 main 方法,但 JVM 只識別標準簽名作為入口。


Q12: 單文件多 public 類?

答:不可。一個 .java 文件僅允許一個 public class,文件名必須與之同名。可有多個 package-private 類。


Q13: Java 包機制與默認導入

包:組織類、避免命名衝突、訪問控制。
默認導入:java.lang.*,無需 import 直接用 String、Object、System 等。


Q14: 訪問控制符

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

類只能 public 或 default。


Q15: final 關鍵字三大用法

  • 修飾類:不可繼承(String、Integer)。
  • 修飾方法:不可覆蓋。
  • 修飾變量:引用不可變(基本類型值不可變,引用類型指向不可變,但對象內部狀態可變)。
  • 接口變量:隱式 public static final。

Q16: static 關鍵字

  • 靜態變量:屬於類,共享一份,類加載時初始化。
  • 靜態方法:屬於類,只能訪問靜態成員,不可用 this/super。
  • 靜態代碼塊:static { },類加載時執行一次,用於靜態初始化。

Q17: finally vs finalize

  • finally:try-catch-finally 塊,異常/返回/正常流程均執行,用於資源釋放。
  • finalize():Object 方法,GC 回收前調用,不可靠、已棄用,勿用於關鍵資源釋放。

Q18: 可否聲明靜態類?

頂層類不可。內部類可 static(靜態內部類),不持有外部類引用,行為同頂層類。


Q19: 靜態導入

import static java.lang.Math.PI;
// 直接用 PI,無需 Math.PI

慎用:濫用降低可讀性,難知來源。


Q20: try-with-resources (Java 7)

try (Resource res = new Resource()) {
    res.use();
} // 自動調用 res.close(),實現 AutoCloseable

解決資源洩漏,代碼更簡潔。


Q21: multi-catch (Java 7)

catch (IOException | SQLException | Exception ex) {
    logger.error(ex);
    throw new MyException(ex.getMessage());
}

異常參數隱式 final,不可修改。


Q22: 接口 vs 抽象類

接口抽象類
關鍵字interfaceabstract class
方法實現Java 8 前無,8+ 有 default/static可有抽象/具體方法
繼承多實現單繼承
構造器無有
main 方法不可運行可運行
變量隱式 static final任意

Q23: 接口可繼承接口?

可,interface A extends B, C。無實現故無菱形問題。


Q24: 標記接口

無方法接口,標識能力:Serializable、Cloneable、Remote。


Q25: 包裝類

8 基本類型對應:Integer、Long 等。不可變、final。Java 5 自動拆裝箱。


Q26: 枚舉

enum Direction { EAST, WEST, NORTH, SOUTH }。常量隱式 static final,可帶字段/方法/實現接口,switch 支持。


Q27: 註解

元數據,@interface 定義。內置:@Override、@Deprecated、@SuppressWarnings。可指定保留策略(SOURCE/CLASS/RUNTIME)。


Q28: 反射

運行時檢查/修改類行為:Class.forName、getMethods、newInstance。破壞封裝、性能差、破壞單例,框架專用,業務代碼慎用。


Q29: 組合

has-a 關系,對象引用實現復用。優於繼承:封裝性好、耦合低、運行時可換實現。


Q30-33: 更多高頻題(續)

  • String 不可變原因:安全、線程安全、哈希碼緩存、字符串池。
  • == vs equals:== 比引用/基本值,equals 比內容(需重寫)。
  • HashMap 擴容機制:負載因子 0.75,容量 2^n,JDK 8 鏈表轉紅黑樹。
  • volatile 關鍵字:可見性、禁止指令重排、不保證原子性。

面試準備建議

  1. 原理 > 背誦:能畫出 HashMap put 流程、JVM 內存模型、類加載雙親委派圖。
  2. 場景化回答:結合項目經歷說「為什麼選這個集合/怎麼調優 GC/如何排查死鎖」。
  3. 手寫代碼:單例模式、生產消費者、LRU Cache、快排/歸併排序。
  4. 關注新版本:Java 11/17/21 LTS 新特性(Record、Pattern Matching、Virtual Threads)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved