Java集合中主要分為兩大體系:collection和Map。也就是值的集合和鍵值對(Entry<K,V>)的集合。
JDK1.2 引入了 Java 集合架構,包含一組資料結構。與數組不同,這些資料結構的存儲空間會随着元素添加動态增加。其中,一些支援添加重複元素另一些不支援,一些支援 null,一些能自動升序列印元素。
所有這些資料結構在 java.util 包裡,包含了
Collection、List、Set、Map、SortedMap
接口。這些接口的實作類有
LinkedList、TreeSet、ArrayList、HashMap
等。除了這些資料結構,java.util 包還提供了
Date、GregorianCalender、StringTokenizer、Random
這樣的工具類。
分類
可以按照接口、實作、算法三個方面對集合架構中的資料結構進行分類:
- 接口:Collection、List、Map 組成了集合架構中所有具體實作類的接口,它們定義了子類必須實作的方法,非常好記。比如向集合添加元素,會用到 Collection 中定義的 add() 方法
- 實作:所有實作了上述3個接口的類,都被稱作集合架構,實際上就是資料結構。比如 LinkedList、TreeSet 等
- 算法:集合架構提供了很多可以直接調用的算法,比如求最大最小值、排序、填充等
【1】Collection接口
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO3kTOzUGNkhTZ5MWMlBTYyYzX5AjM1EDM5AzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
【2】Map接口繼承樹
Map接口下面的均為鍵值對實體(Entry)集合,類名通常以
*Map
結尾,比較特殊的有HashTable和Properties。
集合架構核心接口及實作類:
- 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,底層資料結構紅黑樹
【3】Collection接口詳解
Collection 接口是 List、Set 和 Queue 接口的父接口,該接口裡定義的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
JDK不提供此接口的任何直接實作,而是提供更具體的子接口(如:Set和List)實作。
在 Java5 之前,Java 集合會丢失容器中所有對象的資料類型,把所有對象都當成 Object 類型處理。從 Java5 增加了泛型以後,Java 集合可以記住容器中對象的資料類型
主要方法:
【4】Map接口詳解
Map與Collection并列存在。用于儲存具有映射關系的資料:Key-Value。
Map 中的 key 和 value 都可以是任何引用類型的資料
Map 中的 key 用Set來存放,不允許重複,即同一個 Map 對象所對應的類,須重寫hashCode()和equals()方法。
常用String類作為Map的“鍵”。
key 和 value 之間存在單向一對一關系,即通過指定的 key 總能找到唯一的、确定的 value。
Map 常用方法
- 添加、删除操作:
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()
- 元視圖操作的方法:
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K, V>> entrySet()
- 元素查詢的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
【5】使用Iterator接口周遊集合
Iterator對象稱為疊代器(設計模式的一種),主要用于周遊 Collection 集合中的元素。所有實作了Collection接口的集合類都有一個iterator()方法,用以傳回一個實作了Iterator接口的對象。
Iterator 僅用于周遊集合,Iterator 本身并不提供承裝對象的能力。如果需要建立 Iterator 對象,則必須有一個被疊代的集合。
Iterator iterator = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Java 5 還提供了 foreach 循環疊代通路 Collection:
【6】實作類對比分析
List容器中的每個元素都有一個整數型的序号記載其位置,元素值可以重複,允許多個null。
Map容器中元素為Key-Value對,key不可重複,元素值可以重複,允許一個key為null,HashMap中允許存在多個null為鍵值。
HashTable是Dictionary的子類并實作了Map接口。
Set容器中元素根據hash算法無序存放,元素不可重複,允許一個null。
類\特性 | 有序 | 可重複 | 線程安全 | 存儲結構 | 适用情況 | 父類或接口 |
ArrayList | 是 | 是 | 否 | 數組 | 預設預設選擇 | List |
LinkedList | 是 | 是 | 否 | 連結清單 | 頻繁插入删除 | List |
Vector | 是 | 是 | 是 | 數組 | 線程安全 | List |
HashMap | 無序 | key不可重複Value可重複 | 否 | 根據hashcode進行hash算法得到的值進行存儲 | 預設預設選擇 | Map |
LinkedHashMap | 有序疊代次序與插入順序一緻 | key不可重複Value可重複 | 否 | hash算法+指針 | 需要排序 | HashMap |
TreeMap | 有序根據Key-Value進行排序 | key不可重複Value可重複 | 否 | hash算法+key特定排序 | 特定要求排序 | SortedMap |
HashTable | 無序 | key不可重複Value可重複 | 是 | hash算法 | 線程安全 | Map |
Properties | 無序 | key不可重複Value可重複 | 是 | hash算法 | 線程安全,屬性檔案 | HashTable |
HashSet | 無序 | 不可重複 | 否 | hash算法 | 預設預設選擇 | Set |
LinkedHashSet | 有序根據插入順序排序 | 不可重複 | 否 | hash算法+指針 | 有序 | HashSet |
TreeSet | 有序根據特定排序 | 不可重複 | 否 | hash算法+排序 | 特定排序 |