深入理解hashmap的原理

2021-08-19 22:58:12 字數 1698 閱讀 2436

一、什麼是雜湊?

雜湊也叫雜湊,是將不同長度的輸入通過乙個函式轉換成同乙個長度輸出的過程,這個輸出的值叫雜湊值,這個轉換函式叫雜湊函式,雜湊函式所採用的演算法加雜湊演算法。(實際上是乙個通過訊息得到訊息摘要的方法)

二、什麼是雜湊表?

雜湊表是乙個通過key訪問value的資料結構,它是基於乙個陣列,存資料的時候,通過雜湊函式f(key)得到乙個值,這個值就是乙個陣列下標,然後將value存到陣列對應下標的位置,取資料時則同樣通過f(key)拿到位置取出值,由於陣列通過下標訪問資料的演算法複雜度是 o(1),所以這個效率是非常高的。

三、什麼是hashmap?

hashmap是以hash表為底層結構的訪問鍵值對的資料結構,它同樣基於乙個陣列,這個陣列的每個元素是乙個bucket,我們稱之為桶。這個桶裡面存放著乙個鍊錶,鍊錶的元素是乙個entry物件,entry中包含key,value,hash,next(鍊錶的下個元素的位置),所以hashmap是陣列和鍊錶結合的資料結構。

存資料時,通過雜湊函式f(key)得到陣列的下標,然後將這個entry(鍵值對)存入到對應位置,取資料時,同樣拿到下標從陣列中取出entry,再從entry中拿到value。

四、什麼是雜湊衝突?

當往hashmap中存入資料時,hash函式通過key算出陣列下標,雖然hash函式會盡量優化使得存的位置盡量均勻,但是仍然有可能這個下標已經存過其它資料,這時就產生了hash衝突,簡單說就是兩個資料存到乙個位置,此時鍊錶就有用了,新存入的資料會記錄到鍊錶的頭,之前的資料往後移。

當這種情況取值時,我們首先找到這個位置的,然後遍歷鍊錶,通過key的equal方法找到與之相等的entry,然後從中取出value。

五、hashmap的負載因子是什麼?

預設的負載因子大小為0.75,也就是說,當乙個map填滿了75%的bucket時候,和其它集合類(如arraylist等)一樣,將會建立原來hashmap大小的兩倍的bucket陣列,來重新調整map的大小,並將原來的物件放入新的bucket陣列中。這個過程叫作rehashing,因為它呼叫hash方法找到新的bucket位置。

六、什麼是hashcode()?為什麼重寫equal()方法也要同時重寫hashcode()的方法?

hashcode()方法會呼叫乙個本地方法 

publicnativeinthashcode();

大概返回的是乙個與物件記憶體位址相關的值,

正如我在hash裡定義的,hashcode其實是返回的乙個物件或數值的位址摘要資訊,那麼用他幹什麼呢?

我們往hashmap立put乙個key-value的時候,雜湊函式通過key得到乙個陣列下標,如果key是乙個物件,那麼這個雜湊函式的輸入

值的差異會非常大,轉換也不方便,所以實際上我們hash的是key的hashcode,這樣方便多了。

同樣為什麼重寫equal()方法也要同時重寫hashcode()呢,因為如果重寫了equals方法,很可能是通過物件屬性的值比較物件是否相等,

那麼兩個你以為相等的物件,比如兩個人的物件person1,person2,你定義的是name、age、***屬性分別相等就物件相等,而實際是你把

person1與person2,put到hashmap的時候,他們的位址是不一樣的,hashcode()也是不一樣的,同樣也會存入兩個不同的下標中,取的時候

更不可能取到值。

HashMap內部原理深入理解

hashing 雜湊法 的概念 雜湊法 hashing 是一種將字元組成的字串轉換為固定長度 一般是更短長度 的數值或索引值的方法,稱為雜湊法,也叫雜湊法。由於通過更短的雜湊值比用原始值進行資料庫搜尋更快,這種方法一般用來在資料庫中建立索引並進行搜尋,同時還用在各種解密演算法中。hashmap概念和...

HashMap深入理解

hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。hashmap儲存的是鍵值對,hashmap很快。此類不保證對映的順序,特別是它不保證該順序恆久不變。此實現假定雜湊函式將元素適當地分布在各桶之間,可以為基本操作 get和put 提供...

深入理解simhash原理

lsh locality sensitive hashing 是區域性敏感性hashing,它與傳統的hash是不同的。傳統hash的目的是希望得到o 1 的查詢效能,將原始資料對映到相應的桶內。lsh的基本思想是將空間中原始資料相鄰的2個資料點通過對映或者投影變換後,這兩個資料點在新的空間中的相鄰...