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集合