1. 程式人生 > >List、Set、Map的區別和關係

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、執行緒不同步