一撑瞧,HashMap特點(diǎn)
HashMap的內(nèi)部實(shí)現(xiàn)是數(shù)組+鏈表
每個(gè)元素在數(shù)組中的位置都是根據(jù)key的hash值來確定的
由于key不同的時(shí)候hash值可能也相同禽捆,所以數(shù)組的每個(gè)個(gè)位置保存的是一個(gè)Entry對象鹉究,內(nèi)部也是key,value的形式保存
例如我們添加元素的時(shí)候唯袄,當(dāng)前位置有相同的hash的Entry對象,此時(shí)循環(huán)這個(gè)Entry對象如果有相同的key翩隧,則替換,沒有則添加都表頭,并且指向之前位于表頭的Entry對象
-
讀取元素的時(shí)候腾窝,先通過key的hash,獲取元素的數(shù)組中位置缀踪,然后通過比較Entry對象的key值,如果有虹脯,則返回對應(yīng)的value
ps:當(dāng)某個(gè)位置的鏈表只有一個(gè)的時(shí)候驴娃,此時(shí)的hashMap性能的最好的
HashMap的線程非安全的
hashMap的key值可以為null值
HashMap的默認(rèn)加載因子的0.75,其長度一般都是2的n次冪循集,默認(rèn)長度的16,每次擴(kuò)容都是*2倍
加載因子(HashMap最多能放size*加載因子個(gè)元素)唇敞,提高查詢效率。加載因子過高雖然可以降低空間的開銷咒彤,但是卻提高了查詢某個(gè)元素的時(shí)間
JDK 8對HashMap查詢做了優(yōu)化疆柔,如果某個(gè)位置的鏈表長度大于8的時(shí)候,查詢將變成紅黑樹
二镶柱,HashTable特點(diǎn)
- HashTable是線程安全旷档,因此在速度上Hashmap比HashTable快,HashTable每次都需要獲得同步鎖和放棄同步鎖
- Java5以上奸例,提供ConcurrentHashMap線程安全,比HashTable有更好的效率,比HashTable的擴(kuò)展性更好彬犯。之所以ConcurrentHashMap更好是因?yàn)槭褂昧司植挎i,而HashTable是類鎖
- hashTable key值不能為null查吊,從效率上來說谐区,HashMap比HashTable更好
三,ConcurrentHashMap的實(shí)現(xiàn)原理
四逻卖,TreeMap
五宋列,HashSet