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。
相關推薦:
一段程式碼搞清楚關於Java中List、Set集合及Map的使用
#以上是Java集合:Set、List、Queue、Map四個系統的歸納總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!