91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HashMap的介紹以及擴容為什么是2的n次冪

發布時間:2021-09-04 21:25:37 來源:億速云 閱讀:191 作者:chen 欄目:大數據

本篇內容介紹了“HashMap的介紹以及擴容為什么是2的n次冪”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.什么是HashMap?

    

    HashMap是Java中的集合類,是存放鍵值對形式的數據(Key和Value),例如QQ賬號和QQ密碼,QQ賬號就是Key而密碼則是Value。如下圖所示(假如QQ賬號為123456,密碼為abcdef)


HashMap的介紹以及擴容為什么是2的n次冪


    

    運行結果如下所示



HashMap的介紹以及擴容為什么是2的n次冪



    如果存放相同的Key,那么Value將會被覆蓋,類似于QQ更改密碼,賬號不會變,只有密碼會進行更改。



HashMap的介紹以及擴容為什么是2的n次冪



    運行結果如下所示

    


HashMap的介紹以及擴容為什么是2的n次冪



2.為什么擴容2的n次冪?



    首先先看一下HashMap中的putVal方法(存值的)和resize方法(擴容的),之所以HashMap擴容是2的n次冪和這兩個方法有千絲萬縷的聯系。



    通過putVal方法可以看出來HashMap在存值時會先把key的hash值和擴容后的長度進行一次按位與運算,其中hash是在hash方法中把key進行計算后的出來的結果,n是擴容的長度(也就是數組的長度,默認為16),然后判斷是否hash碰撞在進行不同的存儲。如下圖源碼所示。



HashMap的介紹以及擴容為什么是2的n次冪



    通過resize方法可以看出來擴容時會新建一個tab,然后遍歷舊的tab,將舊的元素進行e.hash & (newCap - 1)的計算添加進新的tab中,也就是(n - 1) & hash的計算方法,其中n是集合的容量,hash是添加的元素經過hash函數計算出來的hash值。如下圖源碼所示。




HashMap的介紹以及擴容為什么是2的n次冪

HashMap的介紹以及擴容為什么是2的n次冪


    之所以這樣2n擴容和上面的兩個方法有極大的關系,首先他們都使用了按位與運算,按位與運算就是把值先變成二進制然后進行運算,如果有0則為0,都為1時則輸出為1,HashMap默認容量為16那么在存放到數組時就是n-1也就是15,而15二進制則是1111擴容后為32-1及11111111

,如果都為1的情況下是可以極大的減少hash碰撞,增加效率的。



    通過下面例子來看一下當容量為11111111時按位與運算的結果,通過下面的結果可以看出來結果很分散,大大減少了hash碰撞的發生。


HashMap的介紹以及擴容為什么是2的n次冪

    再看一下當容量不為11111111而是為其他值的時候,通過下面的結果可以看出,1、2、4跟不同的值進行hash運算但是結果卻是相同的,也就是發生了hash碰撞。


HashMap的介紹以及擴容為什么是2的n次冪

    通過上面的對比可以看出來11111111和其他值

比較大大的減少了hash碰撞的發生,這樣就是為什

么HashMap為什么擴容采用2的n次冪的原因。


“HashMap的介紹以及擴容為什么是2的n次冪”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉林市| 忻州市| 娱乐| 阳山县| 汶上县| 鲁甸县| 汪清县| 姚安县| 石河子市| 宕昌县| 通江县| 碌曲县| 长寿区| 崇阳县| 嫩江县| 休宁县| 甘孜| 金乡县| 手游| 邵阳市| 兴安盟| 会宁县| 鸡西市| 宁都县| 三门峡市| 云龙县| 石棉县| 衡阳县| 福泉市| 自治县| 吉木萨尔县| 本溪市| 肃北| 吉木乃县| 拜城县| 贺州市| 大同县| 碌曲县| 阳谷县| 清涧县| 图们市|