一文快速瞭解Java集合框架
阿新 • • 發佈:2019-05-31
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 介面。
集合框架核心介面及實現類:
- 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 介面實現自定義排序。
在介面與具體的實現類之間還有一些抽象類,如下圖:
這些抽象類為集合增加了很多功能:
- 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,底層資料結構紅黑樹