HashMap的幾個(gè)典型特點(diǎn):
  1.底層由鏈表+數(shù)組實(shí)現(xiàn)
  2.可以存儲(chǔ)null鍵和null值
 3.線性不安全
 4.初始容量為16纷责,擴(kuò)容每次都是2的n次冪(保證位運(yùn)算)
 5.加載因子為0.75,當(dāng)Map中元素總數(shù)超過(guò)Entry數(shù)組的0.75,觸發(fā)擴(kuò)容操作.
 6.并發(fā)情況下乡小,HashMap進(jìn)行put操作會(huì)引起死循環(huán)阔加,導(dǎo)致CPU利用率接近100%
 (1)HashMap底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)為數(shù)組+鏈表的形式,JDK8及其以后的版本中使用了數(shù)組+鏈表+紅黑樹實(shí)現(xiàn)胜榔,解決了鏈表太長(zhǎng)導(dǎo)致的查詢速度變慢的問(wèn)題。
 (2)簡(jiǎn)單來(lái)說(shuō)湃番,HashMap由數(shù)組+鏈表組成的夭织,數(shù)組是HashMap的主體吠撮,鏈表則是主要為了解決哈希沖突而存在的尊惰。HashMap通過(guò)key的HashCode經(jīng)過(guò)擾動(dòng)函數(shù)處理過(guò)后得到Hash值,然后通過(guò)位運(yùn)算判斷當(dāng)前元素存放的位置弄屡,如果當(dāng)前位置存在元素的話,就判斷該元素與要存入的元素的hash值以及key是否相同膀捷,如果相同的話迈嘹,直接覆蓋,不相同就通過(guò)拉鏈法解決沖突秀仲。當(dāng)Map中的元素總數(shù)超過(guò)Entry數(shù)組的0.75時(shí),觸發(fā)擴(kuò)容操作壶笼,為了減少鏈表長(zhǎng)度神僵,元素分配更均勻拌消。
HashMap的主要參數(shù):
DEFAULT_INITIAL_CAPACITY:默認(rèn)的初始化容量挑豌,1<<4位運(yùn)算的結(jié)果是16墩崩,也就是默認(rèn)的初始化容量為16。當(dāng)然如果對(duì)要存儲(chǔ)的數(shù)據(jù)有一個(gè)估計(jì)值鹦筹,最好在初始化的時(shí)候顯示的指定容量大小铝阐,減少擴(kuò)容時(shí)的數(shù)據(jù)搬移等帶來(lái)的效率消耗。同時(shí)铐拐,容量大小需要是2的整數(shù)倍。
MAXIMUM_CAPACITY:容量的最大值遍蟋,1 << 30位吹害,2的30次冪。
?DEFAULT_LOAD_FACTOR:默認(rèn)的加載因子它呀,設(shè)計(jì)者認(rèn)為這個(gè)數(shù)值是基于時(shí)間和空間消耗上最好的數(shù)值。這個(gè)值和容量的乘積是一個(gè)很重要的數(shù)值棒厘,也就是閾值纵穿,當(dāng)達(dá)到這個(gè)值時(shí)候會(huì)產(chǎn)生擴(kuò)容奢人,擴(kuò)容的大小大約為原來(lái)的二倍谓媒。
TREEIFY_THRESHOLD:因?yàn)閖dk8以后何乎,HashMap底層的存儲(chǔ)結(jié)構(gòu)改為了數(shù)組+鏈表+紅黑樹的存儲(chǔ)結(jié)構(gòu)(之前是數(shù)組+鏈表)句惯,剛開始存儲(chǔ)元素產(chǎn)生碰撞時(shí)會(huì)在碰撞的數(shù)組后面掛上一個(gè)鏈表,當(dāng)鏈表長(zhǎng)度大于這個(gè)參數(shù)時(shí)宗弯,鏈表就可能會(huì)轉(zhuǎn)化為紅黑樹脯燃,為什么是可能后面還有一個(gè)參數(shù),需要他們兩個(gè)都滿足的時(shí)候才會(huì)轉(zhuǎn)化辕棚。
UNTREEIFY_THRESHOLD:介紹上面的參數(shù)時(shí),我們知道當(dāng)長(zhǎng)度過(guò)大時(shí)可能會(huì)產(chǎn)生從鏈表到紅黑樹的轉(zhuǎn)化邓厕,但是逝嚎,元素不僅僅只能添加還可以刪除详恼,或者另一種情況补君,擴(kuò)容后該數(shù)組槽位置上的元素?cái)?shù)據(jù)不是很多了昧互,還使用紅黑樹的結(jié)構(gòu)就會(huì)很浪費(fèi),所以這時(shí)就可以把紅黑樹結(jié)構(gòu)變回鏈表結(jié)構(gòu)敞掘,什么時(shí)候變叽掘,就是元素?cái)?shù)量等于這個(gè)值也就是6的時(shí)候變回來(lái)(元素?cái)?shù)量指的是一個(gè)數(shù)組槽內(nèi)的數(shù)量,不是HashMap中所有元素的數(shù)量)玖雁。
??MIN_TREEIFY_CAPACITY:鏈表樹化的一個(gè)標(biāo)準(zhǔn),前面說(shuō)過(guò)當(dāng)數(shù)組槽內(nèi)的元素?cái)?shù)量大于8時(shí)可能會(huì)轉(zhuǎn)化為紅黑樹赫冬,之所以說(shuō)是可能就是因?yàn)檫@個(gè)值浓镜,當(dāng)數(shù)組的長(zhǎng)度小于這個(gè)值的時(shí)候,會(huì)先去進(jìn)行擴(kuò)容膛薛,擴(kuò)容之后就有很大的可能讓數(shù)組槽內(nèi)的數(shù)據(jù)可以更分散一些了,也就不用轉(zhuǎn)化數(shù)組槽后的存儲(chǔ)結(jié)構(gòu)了补鼻。當(dāng)然哄啄,長(zhǎng)度大于這個(gè)值并且槽內(nèi)數(shù)據(jù)大于8時(shí)辽幌,那就轉(zhuǎn)化為紅黑樹吧增淹。