1. 程式人生 > >學習Java集合總結歸納

學習Java集合總結歸納

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。