一文快速瞭解Java集合框架

Java老王發表於2019-05-13

1. 簡介

JDK1.2 引入了 Java 集合框架,包含一組資料結構。與陣列不同,這些資料結構的儲存空間會隨著元素新增動態增加。其中,一些支援新增重複元素另一些不支援,一些支援 null,一些能自動升序列印元素。

所有這些資料結構在 java.util 包裡,包含了 Collection、List、Set、Map、SortedMap 介面。這些介面的實現類有 LinkedList、TreeSet、ArrayList、HashMap 等。除了這些資料結構,java.util 包還提供了 Date、GregorianCalender、StringTokenizer、Random 這樣的工具類。

2. 分類

可以按照介面、實現、演算法三個方面對集合框架中的資料結構進行分類:

  • 介面:Collection、List、Map 組成了集合框架中所有具體實現類的介面,它們定義了子類必須實現的方法,非常好記。比如向集合新增元素,會用到 Collection 中定義的 add() 方法
  • 實現:所有實現了上述3個介面的類,都被稱作集合框架,實際上就是資料結構。比如 LinkedList、TreeSet 等
  • 演算法:集合框架提供了很多可以直接呼叫的演算法,比如求最大最小值、排序、填充等

3. 優缺點

有以下4個優點

  • 減少工作量的同時增加了軟體的可用性:不需要每個程式設計師動手實現排序、查詢、找出元素在資料結構中出現的次數
  • 執行速度更快更持久:集合框架的底層資料結構分為兩類,基於節點的和基於陣列的,前者在頻繁新增時效率更高,後者在頻繁讀取時速度更快。一些資料結構是 synchronized 執行緒安全的,但會影響速度有,另一些則不是執行緒安全的。程式設計師在選用資料結構前要清楚地瞭解這些因素
  • 互操作與轉換:由於實現了 Collection 介面,資料結構之間是可以相互轉換的。可以 clone,可以把現有的結構轉成 synchronized 版本,還可以在把基於連結串列的資料結構轉為基於陣列的結構

有以下2個缺點

  • 當心型別轉換:在集合框架類之間進行轉換時要大大地小心,尤其要考慮泛型型別的相容性
  • 執行時型別檢查:集合框架在執行時會丟擲異常,需要程式設計時多加註意

4. 繼承體系

java.util 中的資料結構繼承體系分為兩大類,一類實現了 Collection 介面,一類實現了 Map 介面。

一文快速瞭解Java集合框架
Collection 繼承體系(圖片來自Wikipedia)

一文快速瞭解Java集合框架

Map 繼承體系(圖片來自Wikipedia)

集合框架核心介面及實現類:

  • Collection:根介面,大部分資料結構都實現了 Collection 介面中的方法
  • Set:實現 Set 介面的資料結構不允許重複的元素,例如 HashSet、LinkedHashSet
  • SortedSet:實現 SortedSet 介面的資料結構預設可按升序列印元素,例如 TreeSet
  • List:實現 List 介面的資料結構允許重複元素,可通過 index 訪問元素,例如 LinkedList、ArrayList、Vector
  • Map:實現 Map 介面的資料結構儲存鍵值對,不允許重複的 key,例如 HashMap、LinkedHashMap、Hashtable
  • SortedMap:繼承了 Map 介面,儲存鍵值對,不允許重複的 key,預設可按 key 升序列印元素,例如 TreeMap

SortedSet 與 SortedMap 預設的排序是自然序,可通過 Comparator 或 Comparable 介面實現自定義排序。

在介面與具體的實現類之間還有一些抽象類,如下圖:

一文快速瞭解Java集合框架

這些抽象類為集合增加了很多功能:

  • HashSet:實現 Set 介面,不允許重複的元素,底層資料結構 hash table
  • LinkedHashSet:實現 Set 介面,不允許重複的元素,底層資料結構 hash table 與雙連結串列
  • TreeSet:實現 NavigableSet 介面,不允許重複的元素,底層資料結構紅黑樹
  • ArrayList:實現 List 介面,允許重複元素,底層資料結構可變陣列
  • LinkedList:實現 List 介面,允許重複元素,底層資料結構雙連結串列
  • Vector:實現 List 介面,允許重複元素,底層資料結構可變陣列
  • HashMap:實現 Map 介面,不允許重複的 key,底層資料結構 hash table
  • LinkedHashMap:實現 Map 介面,不允許重複的 key,底層資料結構 hash table 與雙連結串列
  • HashTable:實現 Map 介面,不允許重複的 key,底層資料結構 hash table
  • TreeMap:實現 SortedMap 介面,不允許重複的 key,底層資料結構紅黑樹


相關文章