Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap簡單的區(qū)別
一、 HashMap
1)底層實(shí)現(xiàn)
數(shù)組+鏈表+紅黑樹(在JDK1.8中如果鏈表長度大于8的時(shí)候才轉(zhuǎn)換為紅黑樹)
2)是否線程安全
不支持線程的同步,線程不安全,如需同步,可用Collections的synchronizedMap方法或者使用ConcurrentHashMap,調(diào)用這個(gè)對象的方法使HashMap具有同步的能力。
3)插入值操作過程
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
addEntry(hash, key, value, index);
return null;
}
4) 特點(diǎn)
HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null,然后和插入效率高,但是插入的數(shù)據(jù)是無序的,插入、刪除和定位元素,HashMap是最好的選擇
5)hashmap什么時(shí)候進(jìn)行擴(kuò)容
當(dāng)hashmap中的元素個(gè)數(shù)超過數(shù)組大小loadFactor時(shí),就會進(jìn)行數(shù)組擴(kuò)容,loadFactor的默認(rèn)值為0.75,也就是說,默認(rèn)情況下,數(shù)組大小為16,那么當(dāng)hashmap中元素個(gè)數(shù)超過160.75=12的時(shí)候,就把數(shù)組的大小擴(kuò)展為2*16=32,即擴(kuò)大一倍,然后重新計(jì)算每個(gè)元素在數(shù)組中的位置,而這是一個(gè)非常消耗性能的操作。
二、 Hashtable
1)底層實(shí)現(xiàn)
它繼承自Dictionary類
2)是否線程安全
支持線程的同步,線程安全,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時(shí)會比較慢
三、LinkedHashMap
1)底層實(shí)現(xiàn)
雙向鏈表+HashMap(LinkedHashMap是繼承于HashMap)
2) 是否支持線程安全
不支持線程的同步,線程不安全
3)特點(diǎn)
保存了記錄的插入順序,也就是數(shù)據(jù)是有序的,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的, 也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序,一般在遍歷的時(shí)候會比HashMap慢,有HashMap的全部特性,不過有種情況例外,當(dāng)HashMap容量很大,實(shí)際數(shù)據(jù)較少時(shí),遍歷起來可能會比LinkedHashMap慢,因?yàn)長inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無關(guān),而HashMap的遍歷速度和他的容量有關(guān)。
四、TreeMap
1)底層實(shí)現(xiàn)
紅黑樹
2)是否線程安全
不支持線程的同步,線程不安全
3)特點(diǎn)
TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過序的。
五、ConcurrentHashMap
1)底層實(shí)現(xiàn)
拓展了Hashtable,底層采用分段的數(shù)組+鏈表實(shí)現(xiàn)
2)是否線程安全
支持線程的同步,線程安全,即任一時(shí)刻只有一個(gè)線程能寫ConcurrentHashMap。
3)特點(diǎn)
鎖分離技術(shù),段內(nèi)擴(kuò)容,ConcurrentHashMap對分開兩次操作也是安全的。
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)