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

Java 高階面試 32 題精選:核心概念陷阱與最佳實務解析

     編輯:Java 相關知識

前言

這 32 道題目涵蓋 Java 基礎語法、集合框架、多執行緒、JVM 機制、設計模式等核心領域,著重考驗對語言細節的深度理解與避坑指南。每題附帶標準答案與深度解析。

題目與解析

1. final / finally / finalize 差異

  • final:修飾符。類不可繼承、方法不可覆寫、變數不可變更(引用不變,物件內容仍可修改)
  • finally:異常處理區塊,try-catch 後必執行(除非 System.exit()),用於資源釋放
  • finalize():Object 方法,GC 回收前調用。已淘汰(Java 9 Deprecated),不可靠,請用 try-with-resources 或 Cleaner

2. 匿名內部類繼承/實作限制

可 繼承一個類 或 實作一個介面,不可同時做兩者。本質是編譯器產生的隱含類別。

3. Static Nested Class vs Inner Class

特性Static Nested ClassInner Class (非靜態)
外部類引用無持有隱含引用 (OuterClass.this)
存取外部成員僅 static 成員所有成員(含私有)
建立實例new Outer.Nested()outer.new Inner()
序列化風險低高(隱含序列化外部類)

4. & vs &&

  • &:位元運算 或 邏輯運算但不短路(兩邊都執行)
  • &&:短路邏輯運算,左邊為 false 時右邊不執行

5. HashMap vs Hashtable

特性HashMapHashtable
同步化非同步(高效能)同步(低效能)
Null Key/Value允許一個 null key、多個 null value完全不允許 null
繼承體系實作 Map繼承 Dictionary(舊 API)
迭代器fail-fastenumerator 不保證

現代替代:多執行緒環境用 ConcurrentHashMap 或 Collections.synchronizedMap()

6. Collection vs Collections

  • Collection:介面,List/Set/Queue 父介面
  • Collections:工具類,提供排序、搜尋、同步包裝等 static 方法

7. assert 使用時機

  • 除錯階段驗證不可違反的假設(如私有方法前置條件)
  • 不可用於公開 API 參數驗證(生產環境可能關閉斷言)
  • 啟用:java -ea 或 -enableassertions

8. GC 機制與目的

  • 自動記憶體管理,避免記憶體洩漏與釋放錯誤
  • 分代收集:新生代、老年代、永久代/Metaspace
  • 可觸發建議:System.gc()、Runtime.getRuntime().gc()(非強制)

9. new String("xyz") 建立幾個物件?

兩個:字串常量池中的 "xyz" + 堆上新建的 String 物件。若常量池已存在則只建一個堆物件。

10. Math.round() 行為

  • Math.round(11.5) == 12
  • Math.round(-11.5) == -11(往正無窮大方向捨入,非對稱)

11. short 運算隱含轉型陷阱


short s = 1;
s = s + 1;      // 錯誤:s+1 是 int,需強制轉型 (short)(s+1)
s += 1;         // 正確:複合指派運算子隱含轉型

12. sleep() vs wait()

特性sleep()wait()
所屬類別ThreadObject
鎖狀態不釋放鎖釋放鎖,進入等待集合
喚醒方式時間到/中斷notify()/notifyAll()/中斷
呼叫前提無必須持有物件鎖(在 synchronized 內)

13. Java 有 goto 嗎?

goto 是保留字但未實作。可用 break/continue 標籤 替代多層迴跳脫。

14. length vs length()

  • 陣列:length 屬性(非方法)
  • String:length() 方法
  • Collection:size() 方法

15. Overload vs Override

特性Overload (多載)Override (覆寫)
發生範圍同一類別父子類別
方法簽名參數列不同完全相同
回傳型別可不同必須相容(共變)
拋出異常無限制不可比父類更寬泛
多型類型靜態(編譯期)動態(執行期)

16. Set 判重機制:equals() 與 hashCode() 契約

  • 先比 hashCode() 快速分桶,再呼叫 equals() 精確比對
  • 核心契約:a.equals(b) == true ⇒ a.hashCode() == b.hashCode()
  • 違反契約會導致 HashSet、HashMap 失效(找不到物件、重複存入)

17. 常見 RuntimeException

NullPointerException、IndexOutOfBoundsException、IllegalArgumentException、ClassCastException、ConcurrentModificationException、ArithmeticException

18. Error vs Exception

  • Error:系統級嚴重問題(OutOfMemoryError, StackOverflowError),應用不應捕獲處理
  • Exception:應用層級可預期/可恢復問題,分 Checked(需處理)與 Unchecked(RuntimeException)

19. Collection 體系繼承關係

  • List ✓ 繼承 Collection
  • Set ✓ 繼承 Collection
  • Map ✗ 不繼承 Collection(鍵值對結構不同)

20. Abstract Class vs Interface

特性Abstract ClassInterface (Java 8+)
方法實作可有具體方法default/static/private 方法可有實作
欄位任意僅 static final 常數
建構子有無
多重實作單一繼承多重實作
設計意圖「是一種」關係、共享程式碼「能做什麼」契約、能力擴展

21. abstract 方法限制

  • 不可同時是 static(靜態屬類別、抽象屬實例)
  • 不可同時是 native(native 表有實作、抽象表無實作)
  • 不可同時是 synchronized(同步是實作細節,抽象方法無本體)

22. 介面/抽象類別繼承規則

  • 介面 可繼承多個介面 (interface A extends B, C)
  • 抽象類別 可實作介面 (abstract class A implements B)
  • 抽象類別 可繼承具體類別(前提:父類有可見建構子)

23. 執行緒啟動:start() vs run()

  • start():建立新執行緒,JVM 排程執行 run()
  • run():單純方法呼叫,在當前執行緒同步執行,無多執行緒效果

24. 建構子可否 Override?

不可**。建構子不屬於繼承成員,但可 Overload(多載)。子類建構子必須呼叫 super() 或 this()。

25. String 類別可否繼承?

不可。String 為 final 類別。設計原因:不可變性、字串常量池、安全性(網路/檔案路徑)、效能優化。

26. synchronized 方法互斥範圍

同一物件 的所有 synchronized 方法共用同一把鎖(this)。一個執行緒進入任一同步方法,其他執行緒無法進入該物件任何同步方法(但可進入非同步方法)。

27. try 中有 return,finally 會執行嗎?

會執行,且在 return 前 執行。finally 可修改回傳值(慎用),System.exit() 除外。

28. 高效計算 2 × 8

2 << 3(左移 3 位 = 乘 2³)。位元運算比乘法指令快,現代 JIT 編譯器會自動優化,人工微優化通常無必要。

29. equals 相同但 hashCode 不同?

違反契約。equals() 回傳 true 時,hashCode() 必須相同。反之不一定(允許碰撞)。

30. 參數傳遞:值傳遞還是引用傳遞?

Java 唯有值傳遞。物件參數傳的是引用的副本。方法內可修改物件內容,但無法改變呼叫端的引用指向。

31. switch 支援型別演進

版本支援型別
Java 1.0-1.4int, short, char, byte
Java 5+ enum
Java 7+ String
Java 12++ switch 表達式 (yield)
Java 17++ Pattern Matching (case Type var)

long/float/double/boolean 不支援

32. Singleton 實作模式

模式一:餓漢式(線程安全、類載入即建立)


public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return INSTANCE; }
}

模式二:懶漢式雙重檢查鎖(DCL,延遲載入、高效能)


public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) instance = new Singleton();
            }
        }
        return instance;
    }
}

模式三:靜態內部類(推薦:延遲載入、線程安全、簡潔)


public class Singleton {
    private Singleton() {}
    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

模式四:Enum 單例(最強:防序列化破壞、防反射攻擊)


public enum Singleton {
    INSTANCE;
    public void doSomething() {}
}

總結

這 32 題涵蓋 Java 核心知識體系的關鍵節點。面試時除背誦答案外,更應理解設計權衡(如效能 vs 安全、繼承 vs 組合)、版本演進(Java 8/11/17 新特性)與實戰最佳實務(如避免 finalize、偏好 Enum Singleton、善用 java.time 替代 Date)。

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