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

Java 核心面試 32 題深度解析:從基礎語法到併發原理

     編輯:Java 程式設計入門

Java 核心面試 32 題深度解析

這 32 道題覆蓋 Java 基礎、集合、併發、JVM、異常等核心領域,是中高級開發者必須掌握的知識體系。本文提供標準答案與深度解析,助你面試通關、查漏補缺。

第一部分:基礎語法與核心類

  1. final / finally / finalize 差異
    • final:修飾符。類不可繼承、方法不可重寫、變量不可修改(引用不變,對象內容可變)、參數不可改變。
    • finally:異常處理塊,try-catch 後必執行(除 System.exit()、JVM 崩潰),用於資源清理。
    • finalize():Object 方法,GC 回收前調用,不推薦使用(不可預測、性能差、Java 9 標記棄用),資源釋放用 try-with-resources 或 Cleaner。
  2. 匿名內部類:可 extends 一個類 或 implements 一個接口(不能同時),本質是隱式繼承/實現的子類實例創建。
  3. Static Nested Class vs Inner Class
    • 靜態嵌套類:無外部類實例引用,獨立存在,訪問外部靜態成員。
    • 內部類(非靜態):持有外部類實例引用(Outer.this),可訪問外部所有成員(含私有),創建需 new Outer().new Inner()。
    • 編譯後:Outer$Inner.class vs Outer$1.class(匿名)。
  4. & vs &&:& 位運算 / 邏輯與(不短路);&& 短路邏輯與,右運算元可能不執行。

第二部分:集合框架

  1. HashMap vs Hashtable
    • 線程安全:Hashtable 同步(性能差),HashMap 非同步(JDK 1.8+ 紅黑樹優化)。
    • Null 鍵值:HashMap 允許 1 個 null key + 多 null value;Hashtable 全禁。
    • 繼承:Hashtable 繼承 Dictionary,HashMap 實現 Map。
    • 迭代器:HashMap fail-fast,Hashtable enumeration + iterator。
  2. Collection vs Collections:前者是頂層接口(List/Set/Queue 父接口),後者是工具類(靜態方法:排序、搜索、同步包裝、不可變視圖等)。

第三部分:併發與線程

  1. assert 用法:斷言調試用,-ea 啟用,-da 禁用。assert expr1 : expr2,expr1 為 false 拋 AssertionError,expr2 為錯誤信息。不可用於公共方法參數校驗(斷言可關閉)。
  2. GC 機制:自動內存回收,根可達性分析,分代收集(新生代/老年代),常見收集器(Serial、Parallel、CMS、G1、ZGC),System.gc() 僅建議。
  3. String s = new String("xyz") 創建對象數:2 個。字符串常量池中 "xyz"(若無則創建)+ 堆上 new String 實例。s.intern() 可手動入池。
  4. Math.round(-11.5):12 / -11。規則:floor(x + 0.5),負數向零方向取整。
  5. short s1 = 1; s1 = s1 + 1 錯誤:s1+1 提升為 int,賦值需強轉。s1 += 1 隱含強轉,正確。
  6. sleep() vs wait()
    • sleep():Thread 靜態方法,釋放 CPU,不釋放鎖,指定時間後進入就緒態。
    • wait():Object 實例方法,必須在 synchronized 同步塊中調用,釋放鎖並進入等待隊列,需 notify/notifyAll 喚醒重新競爭鎖。
  7. Java 無 goto:保留字但未使用。break/continue label 可實現有限跳轉。
  8. 數組無 length() 方法:有 length 屬性;String 有 length() 方法。

第四部分:面向對象與異常

  1. Overload vs Override
    • 重載:同類中,方法名同,參數列表不同(類型/個數/順序),返回類型可不同,非多態。
    • 重寫:子父類中,簽名完全相同(Java 5+ 允許协變返回類型),運行時多態,權限不能更低,拋出異常不能更寬。
  2. Set 去重依賴 equals():HashSet 先比 hashCode() 再 equals();TreeSet 用 compareTo()。== 比引用,equals() 比內容(需正確重寫)。
  3. 常見 RuntimeException:NullPointerException、IndexOutOfBoundsException、ClassCastException、IllegalArgumentException、ArithmeticException。
  4. Error vs Exception:Error(JVM 級嚴重錯誤,如 OutOfMemoryError、StackOverflowError,不可恢復);Exception(程序可處理的異常狀態,分 Checked/Unchecked)。
  5. List/Set 繼承 Collection,Map 不繼承:Map 是鍵值對容器,獨立體系。
  6. abstract class vs interface
    • 抽象類:單繼承,可有構造器、實例變量、非抽象方法、任意訪問修飾符。
    • 接口:多實現,默認 public static final 常量、public abstract 方法(Java 8+ 默認/靜態/私有方法)。
    • 選擇:行為抽象用接口,公共代碼復用用抽象類。
  7. abstract 方法限制:不能 static(靜態屬類)、不能 private(需子類實現)、可 synchronized(鎖子類實例)、可 native(本地方法)。
  8. 接口可繼承接口(多繼承);抽象類可 implements 接口;抽象類可繼承實體類(但實體類無抽象方法則無意義)。
  9. 啟動線程用 start():run() 直接調用同步執行,start() 啟動新線程執行 run()。
  10. 構造器不可 override:非繼承成員,子類可通過 super() 調用父構造器。
  11. String final 不可繼承:安全性、不可變性、字符串常量池機制依賴 final。

第五部分:進階併發與 JVM

  1. synchronized 方法進入後,其他線程訪問同對象其他方法:
    • 其他 synchronized 方法:阻塞(同一對象鎖)。
    • 非 synchronized 方法:可訪問(無鎖競爭)。
    • 靜態 synchronized 方法:鎖 Class 對象,與實例方法鎖互不干擾。
  2. try 中 return,finally 執行時機:一定執行(除 JVM 退出),在 return 執行前(保存返回值到局部變量表,執行 finally,再返回)。finally 中修改返回值會覆蓋(基本類型不影響,引用類型可改對象內容)。
  3. 2 * 8 最有效算法:2 << 3(左移 3 位),位運算最快。
  4. equals true 但 hashCode 不同:違反契約。equals() 相等則 hashCode() 必須相等,反之不強制。用於 Hash 集合會導致元素丟失、查找失效。
  5. 參數傳遞:值傳遞:基本類型傳值副本,引用類型傳引用副本(指向同一對象)。方法內可修改對象內容,但無法改變實參引用指向。
  6. switch 支持類型:byte/short/char/int、包裝類、enum、String (Java 7+)。不支持 long/float/double/boolean。
  7. Singleton 寫法(雙重檢查鎖 + volatile):
    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;
        }
    }
    

總結

這 32 題串聯起 Java 核心知識網。建議:

  • 逐題自測,標記盲區。
  • 深挖原理(如為什麼 String final、HashMap 擴容機制、JMM happens-before)。
  • 結合源碼(JDK 17+)與 JVM 規範理解本質。
  • 實戰中踐行最佳實踐(Effective Java 條目)。

面試題不是背誦對象,而是檢驗知識體系完整性的試金石。真正的掌握,是能在項目中正確選型、排查疑難雜癥、設計高併發系統。

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