一,HashMap特點
HashMap的內(nèi)部實現(xiàn)是數(shù)組+鏈表
每個元素在數(shù)組中的位置都是根據(jù)key的hash值來確定的
由于key不同的時候hash值可能也相同,所以數(shù)組的每個個位置保存的是一個Entry對象,內(nèi)部也是key,value的形式保存
例如我們添加元素的時候,當(dāng)前位置有相同的hash的Entry對象,此時循環(huán)這個Entry對象如果有相同的key,則替換,沒有則添加都表頭,并且指向之前位于表頭的Entry對象
-
讀取元素的時候,先通過key的hash,獲取元素的數(shù)組中位置,然后通過比較Entry對象的key值,如果有,則返回對應(yīng)的value
ps:當(dāng)某個位置的鏈表只有一個的時候,此時的hashMap性能的最好的
HashMap的線程非安全的
hashMap的key值可以為null值
HashMap的默認(rèn)加載因子的0.75,其長度一般都是2的n次冪,默認(rèn)長度的16,每次擴容都是*2倍
加載因子(HashMap最多能放size*加載因子個元素),提高查詢效率。加載因子過高雖然可以降低空間的開銷,但是卻提高了查詢某個元素的時間
JDK 8對HashMap查詢做了優(yōu)化,如果某個位置的鏈表長度大于8的時候,查詢將變成紅黑樹
二,HashTable特點
- HashTable是線程安全,因此在速度上Hashmap比HashTable快,HashTable每次都需要獲得同步鎖和放棄同步鎖
- Java5以上,提供ConcurrentHashMap線程安全,比HashTable有更好的效率,比HashTable的擴展性更好。之所以ConcurrentHashMap更好是因為使用了局部鎖,而HashTable是類鎖
- hashTable key值不能為null,從效率上來說,HashMap比HashTable更好
三,ConcurrentHashMap的實現(xiàn)原理
四,TreeMap
五,HashSet