初識HashMap之初始長度(二)

2021-08-11 02:14:54 字數 984 閱讀 3827

hashmap的初始長度為16,其次在自動擴充套件或手動初始化時,長度必須是2的冪。

初始值選擇16是為了服務從key對映到index的雜湊值。

上篇文章提到過《

初識hashmap(一)》,從key對映到hashmap陣列的對應位置,會用到乙個hash函式:

index =  hash("id")

如何實現乙個盡量均勻分布的hash函式呢?我們通過key的hashcode值來做運算。

有人可能想到用取模的方式實現index =  hashcode(key

) % length ,原理是一樣的,不過取模的執行效率太低,採用位運算。

我們以key為book的為例進行計算:

1.計算book的hashcode,結果為十進位制的3029737,二進位制的

101110001110101110 1001。

2.假定hashmap長度是預設的16,計算length-1的結果為十進位制的15,二進位制的1111。

3.把以上兩個結果做與運算,101110001110101110 1001 & 1111 = 1001,十進位制是9,所以 index=9。

可以說,hash演算法最終得到的index結果,完全取決於key的hashcode值的最後幾位(與hashmap的長度有關)

為了盡量實現均勻分布,長度16或者其他2的冪,length-1的值是所有二進位制位全為1,這種情況下,index的結果等同於hashcode後幾位的值。

只要輸入的hashcode本身分布均勻,hash演算法的

結果就是均勻的。

如果使用的長度為10,對應的二進位制為1100,則101110001110101110 1001&1100=1000

101110001110101110 1011&1100=1000

101110001110101110 1010&1100=1000

這樣出現衝突的可能性更高,達不到均勻分布,所以用2的冪,對應的length-1全是1,更有利於均勻分布

OSPF之初識篇

本人初學tcp ip協議,ospf為重點。現在此地寫下學習逐步歷程 本篇為基礎入門第一步 一 背景 ospf是鏈結狀態協議中最具代表性的協議,鏈結狀態協議與距離向量協議同為動態路由協議的分類 路由分為動態路由和靜態路由,動態路由協議即針對動態路由的協議。路由協議又對路由以及路由表起到了什麼作用呢?以...

設計模式之初識

前言 隨著我們隊面對物件的進一步了解,開始了設計模式的學習。學習設計模式我們需要帶著設計模式是什麼,我們為什麼要學習設計模式,它們有什麼好處,帶著這些問題學習可以幫助我們更好地理解和應用。建立型模式 單例模式 工廠方法模式 抽象工廠模式 建造者模式 原型模式 結構型模式 介面卡模式 橋接模式 裝飾模...

python 基礎之初識

python 它來自於英國超現實主義喜劇團體,而不是來自蛇。python安裝 目前大多數使用的 3.0版本,與 2.0相比它語法有些許更改,比如 print 函式等。其次近些年來大家都在向 3.03.0 版本吧。python程式設計基礎 1.整型 浮點型 字串資料型別 整型 2 1 0 1 2 浮點...