hashmap原理面試 hashmap在,擴(kuò)容,時為什么是乘以2?
hashmap在,擴(kuò)容,時為什么是乘以2?模運(yùn)算可以通過位運(yùn)算H&(length-1)得到,所以效率最高~]。。。沒有容量擴(kuò)展的示例:如果10個存儲桶中有1W數(shù)據(jù),并且每個存儲桶平均有1000個
hashmap在,擴(kuò)容,時為什么是乘以2?
模運(yùn)算可以通過位運(yùn)算H&(length-1)得到,所以效率最高
~]。。。
沒有容量擴(kuò)展的示例:
如果10個存儲桶中有1W數(shù)據(jù),并且每個存儲桶平均有1000個數(shù)據(jù),那么即使jdk8中默認(rèn)有8個以上的存儲桶,它也會將您變成一棵紅黑樹,那么您查找元素的平均時間是log(base 2)1000。
另一方面,如果擴(kuò)容。過程同上,但平均時間會大大縮短。
還有誰說12個會擴(kuò)大?這只是默認(rèn)值。
JDK文檔明確建議在初始化HashMap時,應(yīng)根據(jù)將來存儲的數(shù)據(jù)量一次性指定其容量和加載因子。盡量避免擴(kuò)展(這將導(dǎo)致額外的成本),同時,它不應(yīng)該浪費(fèi)內(nèi)存
1。存儲方法:Java中的HashMap以鍵值的形式存儲元素。2、 調(diào)用原則:HashMap需要一個hash函數(shù),該函數(shù)使用hashcode()和equals()方法向集合中添加和檢索元素。調(diào)用put()方法時,HashMap計算密鑰的哈希值,并將密鑰-值對存儲在集合中相應(yīng)的索引中。如果鍵已存在,則該值將更新為新值。3、 其他熱點(diǎn)特性:HashMap的一些重要特性是容量、負(fù)載因子和閾值調(diào)整。
HashMap實(shí)現(xiàn)了map接口,主要為客戶提供三種數(shù)據(jù)顯示方式:只查看鍵列表;只查看值列表;或者以鍵值形式成對查看數(shù)據(jù)。map接口沒有定義如何存儲數(shù)據(jù),也沒有指定如何確定鍵是否相同。因此,并非所有map實(shí)現(xiàn)都與hashcode方法相關(guān)。例如,treemap要求對象實(shí)現(xiàn)comparator接口,并通過其compare方法(而不是hashcode和equals)比較兩者是否一致。同樣,如果我們自己實(shí)現(xiàn)map接口,也可以直接用數(shù)組來存儲數(shù)據(jù),用==來判斷鍵值是否一致,這樣仍然可以完全滿足map接口的定義。