Java集合大致分為Set、List、Queue、Map四個體系
其中Set代表無序、不可重複的集合;List代表有序、重複集合;Map代表具有映射關係的集合;Queue是隊列的實現。
集合和數組不一樣,數組元素既可以是基本類型的值,也可以是對象(實際上儲存的是對象的引用變數),集合裡面只能儲存對象(實際上只是儲存對象的引用變數)。
Java集合中有兩個派生的 介面:Collection 和 Map
Collection集合體系的繼承樹:
Map集合體系的繼承樹:
下面分別講述
Set集合:
Set集合類似一個罐子,程式可以依次將多個對象“丟進”裡面,Set不會記住元素的添加順序,Set集合不允許有相同的元素。
HashSet:
特點:
不能保證元素的排列順序
HashSet不是同步的
集合元素值可以為null
HashSet判斷兩個元素相等的標準是:兩個對象通過equals()方法比較相等,並且兩個對象的hashcode()方法傳回值也相等。
注意:當把一個對象放進HashSet中時,如果需要重寫該對象的equals()方法,則應該重寫其hashCode()方法。規則是:如果兩個對象通過equals()方法比較返回true,兩個對象的hashCode值應該相同。
LinkedSet:
LinkedSet根據原始的hashCode的值來決定元素的儲存位置,但是他同時使用鏈表維護元素的次序,這樣使得元素的插入的順序儲存。LinkedSet會按照元素的添加順序來訪問集合裡的元素。
LinkedSet需要維護元素的插入位置,因此效能會略低於HashSet的效能。
TreeSet:
TreeSet可以確保集合元素處於排序狀態。
TreeSet並不是根據元素的插入順序進行排序的,而是根據元素的實際值的大小來進行排序的。
TreeSet採用紅/黑樹狀結構的資料結構來儲存集合元素。
TreeSet支援兩種排序方法:自然排序和定製排序。在預設情況下,TreeSet採用自然排序。
自然排序:TreeSet會調用集合元素的compareTo(Object obj)方法來比較元素之間的大小關係,然後將集合元素按升序排列。在預設情況下,TreeSet採用自然排序。
當把一個對象加入TreeSet集合中時,TreeSet調用該對象的compareTo(Object obj)方法與容器中的其他對象比較大小,然後根據紅/黑樹狀結構結構找到它的儲存位置。
判斷兩個對象是否相等的唯一標準是:兩個對象通過compareTo(Object obj)方法比較是否返回0。
如果兩個對象通過equals()方法比較返回true時,這兩個對象通過compareTo(Object obj)方法比較應返回0。
定製排序:如果需要實現定製排序,則需要在建立TreeSet集合對象時,提供一個Comparator對象與該TreeSet集合關聯,由該Comparator對象負責集合元素的排序邏輯。
EnumSet:
EnumSet的集合元素也是有序的,EnumSet以枚舉值在Enum類內部的定位順序來決定集合元素的順序。
EnumSet內部以位向量的形式儲存。
EnumSet集合不允許加入null元素。
各Set實作類別的效能分析:
HashSet的效能總比TreeSet好,因為TreeSet需要額外的紅/黑樹狀結構演算法來維護集合的次序。
LinkedSet對於普通的插入、刪除操作,LinkedSet比HashSet要稍微慢一些,這是由維護鏈表所帶來的額外開銷造成的。但是由於有鏈表,遍曆LinkedSet比較快。
EnumSet效能最好,但只能儲存同一個枚舉類得枚舉值作為集合元素。
List:
List代表一個元素有序,可重複的結合,集合中的每個元素都有對應的順序索引。
List集合可以根據位置索引來訪問集合中的元素,因此List可以使用for迴圈來遍曆。
ArrayList、LinkedList和Vector
ArrayList源碼分析:
LinkedList源碼分析:
Queue:
Queue用於類比隊列這種資料結構。
PriorityQueue:
PriorityQueue儲存隊列元素的順序並不是按照加入的順序,而是按照隊列元素的大小進行排序的。
PriorityQueue不允許插入null元素。
Deque:
Deque介面是Queue介面的子介面,它代表一個雙端隊列。
當程式中需要使用“棧”這種資料結構時,推薦使用ArrayDeque。
各種線性表的效能分析:
1.如果需要遍曆List集合元素,對ArrayList、Vector集合,應該使用隨機存取方法(get)來遍曆集合元素,這樣效能更好;對於LinkedList集合應該使用迭代器(Iterator)來遍曆集合元素。
2.如果需要經常執行插入、刪除,應使用LinkedList。
3.如果多線程同時訪問List集合中的元素,應該使用Collections將集合封裝成安全執行緒的集合。
Map:
Map的key不允許重複,即同一個Map對象的任何兩個key通過equals方法比較總是返回false。
Map中存在一個keySet()方法,用於返回Map中所有key組成的Set集合。
HashMap、Hashtable:
HashMap和Hashtable的區別:
1.Hashtable是一個安全執行緒的Map,HashMap是非安全執行緒的,所以HashMap的效能比較好。
2.Hashtable不允許使用null作為key和value,HashMap允許使用null作為key或者value。
Hashtable、HashMap判斷兩個key相等的標準是:兩個的key的equals()方法返回true,兩個key的HashCode值相同;判斷兩個value相等的標準是value的equals()方法傳回值相同。
LinkedMap:
LinkedMap會記住key-value的添加順序。
TreeMap:
TreeMap也是採用了紅/黑樹狀結構的結構,TreeMap中判斷兩個key相等的標準是:
兩個key通過compareTo()方法的傳回值為0.(在自然排序下)
兩個key通過compareTo()方法的傳回值為0.同時equals()方法比較返回為true。(定製排序下)。
EnumMap:
EnumMap內部以數組的形式儲存。
EnumMap不允許使用null作為key,但是允許value為null。
Map的效能分析:
HashMap的效能要比Hashtable的效能要好。
TreeMap中的key-value對總是處於有序狀態,無須進行專門的排序操作。
對於一般的運用情境,多考慮使用HashMap。
LinkedMap要比HashMap慢,是因為需要維護鏈表來保持key-value的添加順序。
EnumMap的效能最好,但是只能使用同一個枚舉類的枚舉值作為key。