List、Set、Map的區別和關係
三者的關係圖:
一、超級介面
Iterable:
該介面中會返回一個迭代器,實現該介面的類都能作為forEach的物件。
二、Collection:繼承了Iterable介面,並且可以被以下類實現。
collection是集合listst和set的介面。
(一)List介面(有序)
1、LinkedList實現類:
注:A、LinkedList底層使用雙向連結串列實現的,因此它對於資料的增加刪除操作效率較ArrayList要高;
B、對資料的查詢需要操作指標,所以查詢操作效率較低;
C、LinkedList不是執行緒安全的;
D、資料可重複;
2、ArrayList實現類:
底層是用陣列實現的,並且預設長度(容量)為10:
private static final int DEFAULT_CAPACITY = 10;
注:A、ArrayList底層是用陣列實現的,通過索引下標可以快速的查到資料,所以它對資料的查詢操作效率高的多;
B、ArrayList不是執行緒安全的。
C、資料可重複性
3、vector:
注:A、vector是執行緒安全的;
B、資料可重複
C、通過陣列來實現的,但是效率一般比ArrayList低,如果不考慮執行緒安全問題,一般使用ArrayList
(二)Set介面(無序)
1、HashSet實現類:
注:A、HashSet不是執行緒安全的;
B、HashSet允許有空值;
C、HashSet中不允許有相同值得存在;
2、TreeSet實現類:
注:A、TreeSet是執行緒不安全的
B、該類實現了SortedSet介面,通過Comparator或者Comparable維護了一個排序順序(二叉樹)。
3、LinkedHashSet類:
注:A、通過資料的插入順序對其進行順序儲存。
三、Map
Map只是一個介面,不是collection的子介面或者實現類,它是以鍵值對的形式進行儲存的。
1、Map介面的一些實現類:
HashMap、TreeMap、LinkedHashMap和HashTable。
2、HashMap:
A、HashMap是基於雜湊表的Map介面的非同步實現,允許使用null值和null鍵,但不保證對映的順序。
B、底層使用陣列實現,陣列中每一項是個單向連結串列,即陣列和連結串列的結合體;當連結串列長度大於一定閾值時,連結串列轉換為紅黑樹,這樣減少連結串列查詢時間。
C、HashMap在底層將key-value當成一個整體進行處理,這個整體就是一個Node物件。HashMap底層採用一個Node[]陣列來儲存所有的key-value對,當需要儲存一個Node物件時,會根據key的hash演算法來決定其在陣列中的儲存位置,在根據equals方法決定其在該陣列位置上的連結串列中的儲存位置;當需要取出一個Node時,也會根據key的hash演算法找到其在陣列中的儲存位置,再根據equals方法從該位置上的連結串列中取出該Node。
D、HashMap進行陣列擴容需要重新計算擴容後每個元素在陣列中的位置,很耗效能
E、採用了Fail-Fast機制,通過一個modCount值記錄修改次數,對HashMap內容的修改都將增加這個值。迭代器初始化過程中會將這個值賦給迭代器的expectedModCount,在迭代過程中,判斷modCount跟expectedModCount是否相等,如果不相等就表示已經有其他執行緒修改了Map,馬上丟擲異常
3、HashTable:
A、Hashtable是基於雜湊表的Map介面的同步實現,不允許使用null值和null鍵
B、底層使用陣列實現,陣列中每一項是個單鏈表,即陣列和連結串列的結合體
C、Hashtable在底層將key-value當成一個整體進行處理,這個整體就是一個Entry物件。Hashtable底層採用一個Entry[]陣列來儲存所有的key-value對,當需要儲存一個Entry物件時,會根據key的hash演算法來決定其在陣列中的儲存位置,在根據equals方法決定其在該陣列位置上的連結串列中的儲存位置;當需要取出一個Entry時,也會根據key的hash演算法找到其在陣列中的儲存位置,再根據equals方法從該位置上的連結串列中取出該Entry。
D、synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨佔
4、TreeMap:
A、底層是二叉樹的結構
B、執行緒不同步