天天看點

Java集合概述和總結分析與圖示

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接口

Java集合概述和總結分析與圖示
Java集合概述和總結分析與圖示

【2】Map接口繼承樹

Java集合概述和總結分析與圖示

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 接口實作自定義排序。

在接口與具體的實作類之間還有一些抽象類,如下圖:

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,底層資料結構紅黑樹

【3】Collection接口詳解

Collection 接口是 List、Set 和 Queue 接口的父接口,該接口裡定義的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。

JDK不提供此接口的任何直接實作,而是提供更具體的子接口(如:Set和List)實作。

在 Java5 之前,Java 集合會丢失容器中所有對象的資料類型,把所有對象都當成 Object 類型處理。從 Java5 增加了泛型以後,Java 集合可以記住容器中對象的資料類型

主要方法:

Java集合概述和總結分析與圖示
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:

Java集合概述和總結分析與圖示

【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算法+排序 特定排序

繼續閱讀