1. 程式人生 > >HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList對比

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList對比

HashSet與HashMap區別

HashMap實現了Map介面 
HashSet實現了Set介面

HashMap儲存鍵值對 
HashSet僅僅儲存物件

HashMap使用put()方法將元素放入map中 
HashSet使用add()方法將元素放入set中

HashMap中使用鍵物件來計算hashcode值 
HashSet使用成員物件來計算hashcode值

HashMap比較快,因為是使用唯一的鍵來獲取物件 

HashSet較HashMap來說比較慢

HashTable與HashMap的區別

Hashtable方法是同步的 
HashMap方法是非同步的

Hashtable基於Dictionary類 
HashMap基於AbstractMap,而AbstractMap基於Map介面的實現

Hashtable中key和value都不允許為null,遇到null,直接返回 NullPointerException 
HashMap中key和value都允許為null,遇到key為null的時候,呼叫putForNullKey方法進行處理,而對value沒有處理

Hashtable中hash陣列預設大小是11,擴充方式是old*2+1 
HashMap中hash陣列的預設大小是16,而且一定是2的指數

什麼是ArrayList

ArrayList可以理解為動態陣列,它的容量能動態增長,該容量是指用來儲存列表元素的陣列的大小,隨著向ArrayList中不斷新增元素,其容量也自動增長 
ArrayList允許包括null在內的所有元素 
ArrayList是List介面的非同步實現 
ArrayList是有序的

ArrayList實現了List介面、底層使用陣列儲存所有元素,其操作基 本上是對陣列的操作

ArrayList繼承了AbstractList抽象類,它是一個數組佇列,提供了相關的新增、刪除、修改、遍歷等功能

ArrayList實現了RandmoAccess介面,即提供了隨機訪問功能,RandmoAccess是java中用來被List實現,為List提供快速訪問功能的,我們可以通過元素的序號快速獲取元素物件,這就是快速隨機訪問

ArrayList實現了Cloneable介面,即覆蓋了函式clone(),能被克隆 
ArrayList實現了java.io.Serializable介面,意味著ArrayList支援序列化

什麼是LinkedList

LinkedList基於連結串列的List介面的非同步實現 
LinkedList允許包括null在內的所有元素 
LinkedList是有序的 
LinkedList是fail-fast的

LinkedList與ArrayList的區別

LinkedList底層是雙向連結串列 
ArrayList底層是可變陣列

LinkedList不允許隨機訪問,即查詢效率低 因為LinkedList要移動指標
ArrayList插入和刪除效率低 因為ArrayList要移動資料

解釋一下:

對於隨機訪問的兩個方法,get和set,ArrayList優於LinkedList,因為LinkedList要移動指標 
對於新增和刪除兩個方法,add和remove,LinedList比較佔優勢,因為ArrayList要移動資料

什麼是ConcurrentHashMap

ConcurrentHashMap基於雙陣列和連結串列的Map介面的同步實現 
ConcurrentHashMap中元素的key是唯一的、value值可重複 
ConcurrentHashMap不允許使用null值和null鍵 
ConcurrentHashMap是無序的

為什麼使用ConcurrentHashMap

我們都知道HashMap是非執行緒安全的,當我們只有一個執行緒在使用HashMap的時候,自然不會有問題,但如果涉及到多個執行緒,並且有讀有寫的過程中,HashMap就會fail-fast。要解決HashMap同步的問題,我們的解決方案有

Hashtable 
Collections.synchronizedMap(hashMap) 
這兩種方式基本都是對整個hash表結構加上同步鎖,這樣在鎖表的期間,別的執行緒就需要等待了,無疑效能不高,所以我們引入ConcurrentHashMap,既能同步又能多執行緒訪問

ConcurrentHashMap的資料結構

ConcurrentHashMap的資料結構為一個Segment陣列,Segment的資料結構為HashEntry的陣列,而HashEntry存的是我們的鍵值對,可以構成連結串列。可以簡單的理解為數組裡裝的是HashMap

這裡寫圖片描述

從上面的結構我們可以瞭解到,ConcurrentHashMap定位一個元素的過程需要進行兩次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的連結串列的頭部,因此,這一種結構的帶來的副作用是Hash的過程要比普通的HashMap要長,但是帶來的好處是寫操作的時候可以只對元素所在的Segment進行加鎖即可,不會影響到其他的Segment。正是因為其內部的結構以及機制,ConcurrentHashMap在併發訪問的效能上要比Hashtable和同步包裝之後的HashMap的效能提高很多。在理想狀態下,ConcurrentHashMap 可以支援 16 個執行緒執行併發寫操作(如果併發級別設定為 16),及任意數量執行緒的讀操作

重要:

Collection介面中有兩個常用的子介面:List(列表),Set(集)。
List:可存放重複元素,元素存取是有序的。
                 ArrayList:底層為陣列結構。查詢速度快。增刪稍慢。執行緒不同步。
                 LinkedList:底層為連結串列結構。增刪速度快,查詢稍慢。執行緒不同步
                 Vector:底層為陣列結構。執行緒同步。被ArrayList替代了。因為效率低。

Set:不可以存放重複元素,元素存取是無序的
                HashSet:資料結構是雜湊表。執行緒不同步。hashCode和equals
                TreeSet:可以對Set集合中的元素進行排序,資料結構為二叉樹
                                實現Comparable介面,覆蓋compareTo(Object obj)方法
                                實現Comparator介面,覆蓋compare(Object o1,Object o2)方法
Map:儲存鍵值對,鍵不可以重複,值可以重複。
                取出map集合元素的兩種方式方法keySet()和entrySet()
                Hashtable: 資料結構為雜湊表,不可以存入null鍵null值,執行緒同步。
                HashMap:資料結構為雜湊表,允許使用 null 值和 null 鍵,執行緒不同步。
                TreeMap:資料結構為二叉樹。執行緒不同步。
                                用於給map集合中的鍵進行排序(排序方法和TreeSet一樣,實現comparable和comparator兩個介面即可)。
注:其實Set底層就是使用了Map集合