一、HashMap的哈希桶的初始大小是多少违崇?
初始大小為16舆蝴,并且必須為2的n次方
二、java 7 和 java 8 對于HashMap的實現(xiàn)有何不同幢泼?
java 7 實現(xiàn)方式: 數(shù)組 + 鏈表
java 8 實現(xiàn)方式: 數(shù)組 + 鏈表 / 紅黑樹(鏈表長度大于8)
Java 7 HashMap 存在的問題
1紧显、并發(fā)環(huán)境下非常容易碰到死鎖
2、由于hashcode算法缺陷缕棵,HashMap容易產(chǎn)生鏈表孵班,影響性能的同時存在安全隱患
Java 8 HashMap的改進
擴容時插入順序保持不變,防止出現(xiàn)環(huán)形鏈表招驴,形成死循環(huán)
HashMap 擴容時的效率很低篙程,所以在創(chuàng)建HashMap時就指定初始容量,避免頻繁的擴容帶來的性能問題忽匈,用空間換時間房午。
三、為什么HashMap哈希桶的大小必須為2的n次方丹允?
在將一個元素put進一個HashMap時郭厌,需要計算其在數(shù)組中的下標,在調(diào)用該對象的hashcosd方法后算出一個int值雕蔽,即為該元素的hash值折柠,要根據(jù)該hash值來確定元素在數(shù)組中的位置,采用的算法是按位與運算: hashcode & (array.length-1) 只有桶的大小為2的冪批狐,array.length-1得到的值二進制永遠全部都是1扇售,這樣計算出來的下標分布均勻并且快速;反之嚣艇,如果array.length-1得到的值二進制中存在0承冰,做按位于運算后永遠都是0,,則有些下標位置永遠都會空著食零。