1. 程式人生 > >Hashmap,Set,Map,List,ArrayList的區別

Hashmap,Set,Map,List,ArrayList的區別

安全 列表 jdk1 bsp 固定 syn 實現 是否 並且

                  表格:

類型

默認容量

加載因子[1]

擴容增量

底層實現

是否安全及同步方式

Vector

10

1

2

Object數組

安全,synchronized

ArrayList

10

1

1.5倍(>>1

Object數組

線程不安全

LinkedList

1

無(11個加

鏈表

線程不安全

HashSet

16

0.75

2

HashMap<E,Object>

線程不安全

HashMap

16

0.75

1

存放鏈表的數組[2]

Map.Entry

線程不安全

HashTable

11

0.75

2+1

存放鏈表的數組[2]

HashTable.Entry

線程安全,synchronized

1】:加載因子:擴容因子

=已存容量/現有容量。0.75表示當使用容量達到3/4時擴容。

2HashMap中,都是是以鏈表實現的。在HashMap中,先對key值求hash,然後根據hash確定存放位置(內存中占用的地址),一般情況下hash值不會相同。但當數據量大是,hash值(內存存放地址)就會相同,這時會以鏈表的形式存放新的數據。

技術分享圖片

List(列表)

List的特征是其元素以線性方式存儲,集合中可以存放重復對象。

List接口主要實現類包括:

ArrayList() :數組。內存空間連續。默認初始容量是10,每次增加一半(右移),線程不安全。便於查詢而不便於增刪

LinkedList():鏈表(節點)。內存空間不連續。線程不安全。便於增刪不便於查詢

對於List的隨機訪問來說,就是只隨機來檢索位於特定位置的元素。 List get(int index) 方法放回集合中由參數index指定的索引位置的對象,下標從“0” 開始。

兩種列表的區別:1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。

2.對於隨機訪問getsetArrayList覺得優於LinkedList,因為LinkedList要移動指針。

3.對於新增和刪除操作addremoveLinedList比較占優勢,因為ArrayList要移動數據。

總結:ArrayListLinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:

1.對ArrayListLinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。

2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3LinkedList不支持高效的隨機元素訪問。

4ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

可以這樣說:當操作是在一列數據的後面添加數據而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數據的前面或中間添加或刪除數據,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

HashSetHashMap的區別

這裏涉及到HashSet的本質:(1)HashSetset的一個實現類,hashMapMap的一個實現類,同時hashMaphashTable的替代品

(2)HashSet以對象作為元素,HashMap(key-value)的一組對象作為元素,HashSet拒絕接受重復的對象.HashMap可以看作三個視圖:keySetvalueCollectionEntrySet。 這裏HashSet就是其實就是HashMap的一個視圖。

HashSet內部就是使用Hashmap實現的,和Hashmap不同的是它不需要KeyValue兩個值。

hashset中插入對象其實只不過是內部做了

HashMapHashTable的區別

HashMap允許鍵或者值為null。默認初始容量是16,加載因子是0.75f,默認增加一倍。是一個異步式線程不安全的映射,HaseTable不允許鍵或者值為null。默認初始容量是11,加載因子是0.75f。是一個同步式線程安全的映射---僅僅在筆試中出現.

都屬於Map接口的類,實現了將惟一鍵映射到特定的值上。

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許 .

HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。

Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現

還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,

多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

註意!

jdk1.8之後,HashMap的儲存機制發生改變:數組table中的鏈表長度大於8時,自動轉換為紅黑樹!

Hashmap,Set,Map,List,ArrayList的區別