多態是面向對象的靈魂,集合框架是日常開發的利器。本文系統梳理編譯時/運行時多態差異、集合繼承體系、迭代器模式、工具類區別。
多態的兩種形態
| 類型 | 別名 | 實現機制 | 綁定時機 | 示例 |
| 編譯時多態 | 靜態多態/重載 | 方法簽名不同(參數類型/個數/順序) | 編譯期 | print(int) vs print(String) |
| 運行時多態 | 動態多態/重寫 | 子類覆寫父類方法,父類引用指向子類對象 | 運行期 | Animal a = new Cat(); a.sound() |
運行時多態三要素
- 繼承: 子類 extends 父類 / implements 接口
- 重寫: 方法簽名相同,@Override 註解驗證
- 向上轉型: 父類引用 = new 子類()
核心價值
- 開閉原則: 新增子類無需修改調用端代碼
- 接口編程: 面向抽象而非具體實現,降低耦合
- 插件化架構: SPI、策略模式、責任鏈均依賴多態
集合框架繼承體系
Collection (I)
├─ List (I) → 有序、可重複
│ ├─ ArrayList → 動態數組,隨機訪問快
│ ├─ LinkedList → 雙向鏈表,首尾增刪快
│ └─ Vector/Stack → 同步、歷史遺留
├─ Set (I) → 無序、不可重複
│ ├─ HashSet → HashMap 底層,O(1)
│ ├─ LinkedHashSet → 維護插入順序
│ └─ TreeSet → 紅黑樹,有序 O(log n)
└─ Queue (I) → 佇列語義
├─ PriorityQueue → 堆,優先級排序
└─ ArrayDeque → 雙端佇列,棧/佇列雙役
Map (I) → 鍵值對,Key 唯一
├─ HashMap → 數組+鏈表/紅黑樹,O(1)
├─ LinkedHashMap → 維護插入/訪問順序
├─ TreeMap → 紅黑樹,Key 有序
├─ Hashtable → 同步、歷史遺留
└─ ConcurrentHashMap → 分段鎖/CAS,高併發
Collection vs Collections
| 名稱 | 類型 | 角色 |
| Collection | 接口 | 集合層級根接口,定義 add/remove/iterator 等 |
| Collections | 工具類 | 靜態方法:sort、binarySearch、synchronizedList、unmodifiableList 等 |
迭代器模式
- 角色: 統一遍歷接口,屏蔽底層數據結構差異
- 核心方法:
hasNext(), next(), remove(), forEachRemaining() (JDK8)
- 快速失效: 遍歷過程中結構性修改拋
ConcurrentModificationException
- 使用場景: 通用算法(如統一導出、序列化)、切換實現無需改遍歷代碼
數組 vs 集合
- 數組:固定長度、基本類型支援、隨機訪問 O(1)、內存緊湊
- 集合:動態擴容、僅存對象引用、豐富 API、泛型類型安全
- 轉換:
Arrays.asList()、list.toArray()、Stream API 互通