阿里 Java 開發高頻面試題精選(四):基礎核心、集合、並發、JVM、架構全覆蓋
Java 三大特性
封裝、繼承、多態。
抽象類 vs 接口
- 共同點:均不可實例化,位於繼承樹頂端,含抽象方法需子類實現;
- 不同點:接口只能有常量和抽象方法(Java 8 前),無構造器/初始化塊;抽象類可有普通成員/方法/構造器;單繼承 vs 多實現;接口更抽象(無默認實現)。
棧 vs 堆、值傳遞 vs 引用傳遞
- 棧:基本類型變量、對象引用,作用域結束自動釋放;
- 堆:
new 對象/數組,GC 管理,無引用時變垃圾;
- Java 只有值傳遞:基本類型傳值,引用類型傳引用的值(地址副本)。
單例模式
構造器私有、靜態方法獲取實例。優點:受控訪問、節省資源、可變實例數;缺點:擴展難、職責重、濫用導致連接池溢出/狀態丟失。
重載 vs 重寫
- 重載:同類中,同名、參數列表不同(個數/類型/順序),返回類型無關;
- 重寫:父子類,同名、同參數、同返回類型,子類權限 ≥ 父類,
@Override 校驗。
子父類轉換與構造順序
子類自動向上轉型為父類。構造順序:子類構造器 → 父類構造器 → 父類執行 → 子類執行。
final / finally / finalize
- final:修飾屬性/方法/類 → 不可變/不可覆蓋/不可繼承;
- finally:異常塊,總是執行;
- finalize:Object 方法,GC 前調用,可覆蓋釋放資源。
synchronized vs volatile
- volatile:變量級,保證可見性、禁止重排序,無鎖、不阻塞;
- synchronized:鎖級,保證原子性+可見性+有序性,鎖監視器,同步線程內存,開銷大;
- 本質區別:volatile 單變量同步,synchronized 整線程內存同步。
集合體系
- Collection → Set(無序唯一)、List(有序可重);Map(Key-Value, Key 唯一);
- 集合接口不實現 Cloneable/Serializable:具體實現決定語義,接口層面無意義。
hashCode/equals 契約
- equals 真 → hashCode 必相等;
- hashCode 相等 → equals 不一定真;
- HashMap 依賴兩者定位桶、判斷鍵唯一,實現錯誤導致覆蓋/查找失效。
HashMap vs Hashtable
- HashMap:非同步、允許 null key/value、Iterator fail-fast;
- Hashtable:同步、不允許 null、Enumeration;
- 並發首選
ConcurrentHashMap(Segment/CAS 細粒度鎖)。
Comparable vs Comparator
- Comparable:內部比較(
compareTo),類本身實現,如 String/Integer;
- Comparator:外部比較器(
compare),不修改原類,策略模式;
- 自定義類排序 → 實現 Comparable;第三方/多策略 → Comparator。
HashMap 工作原理(核心)
- Entry 內部類存 K-V;
- Entry[] table 數組,邏輯分桶;
hash(key.hashCode()) → indexFor 定位桶;
- 鏈表解決衝突,
equals 保證 Key 唯一;
- Value 的 hashCode/equals 無關緊要。
String / StringBuffer / StringBuilder
- String:final char[],不可變,線程安全;
- StringBuffer:同步方法,線程安全;
- StringBuilder:非同步,高性能,單線程首選。
ArrayList vs LinkedList
- ArrayList:數組,查快增刪慢;
- LinkedList:雙向鏈表,增刪快查慢。
GC 機制
- 引用計數:簡單但難解決循環引用;
- 可達性分析(GC Roots 遍歷):主流 JVM 採用,準確判斷存活。
序列化與反序列化
對象 → 字節序列(持久化/網絡傳輸/跨進程)→ 對象。核心目的:跨進程傳遞格式化數據。
Java 靈活性體現
反射機制:運行時獲取類信息、動態調用、ORM 映射基石。
sleep vs wait
- sleep:Thread 靜態方法,不釋放鎖,指定時間後自動恢復;
- wait:Object 實例方法,釋放鎖,進入等待池,需 notify/notifyAll 喚醒進入鎖池。
IO vs NIO
- IO:流導向、阻塞;NIO:緩衝區導向、非阻塞、Selector 多路複用;
- NIO 單線程管理多 Channel,高併發優勢明顯。
Socket 基本步驟
- 創建 Socket;
- 獲取輸入/輸出流;
- 協議讀寫;
- 關閉 Socket。
深/淺克隆
UDP vs TCP
- TCP:面向連接、可靠、字節流、三次握手/四次揮手;
- UDP:無連接、不可靠、報文、無序、高效(視頻/直播)。
紅黑樹
自平衡 BST,5 大約束 → 最長路徑 ≤ 2×最短路徑,查詢 O(log n)。
反射應用
POJO 屬性↔數據庫字段映射:約定大於配置,自動拼 SQL / 封裝 ResultSet。
三次握手 / 四次揮手
握手:SYN → SYN+ACK → ACK(雙方分配資源);
揮手:FIN → ACK → FIN → ACK(全雙工單向關閉)。
equals vs ==
- ==:比較棧內容(基本類型值 / 引用地址);
- equals:比較堆內容(對象邏輯相等),可重寫;
- equals 真 → == 不一定真。