什麼是Hash以及HashMap

哈希總結


總結:
1.哈希又稱散列哈希算法也稱散列算法

2.哈希一般指哈希算法,即將任意值(如:‘紙上得來終覺淺’)經過hash算法可得到一個固定長度的組合串(字母和數字組成),如下圖:MD5與SHA-256爲哈希算法中不同的輸出標準。

在這裏插入圖片描述
3.哈希算法是數據查找技術中最經典的算法之一。所以有用哈希算法建立索引值,加快查詢速度。

4.哈希算法具有不可逆性

5.哈希存在"哈希碰撞"。假設f是哈希函數,y是哈希結果,x是鍵值,可得:y = f(x)
哈希碰撞不同的鍵值(x)有可能獲得相同的結果(y), 這就是hash碰撞。但是不同的y值一定對應不同的x值。

6.基於哈希的存儲結構有:HashMapHashTable等。


HashMap總結
問題1: HashMap的內部組成結構(屬性)是哪些?以及作用?
問題2:HashMap的默認初始容量(桶)大小?
問題3:理解爲什麼HashMap底層實現是數組+鏈表的形式?
問題4:rehash是什麼?如果禁用resize()會發生什麼?
問題5:hashCode()在java中默認使用的哈希函數是什麼,或者說Objects.hashCode()用了什麼類型的哈希函數?

問1答:主要屬性有如圖:原圖出自
在這裏插入圖片描述
table:很多文章都有這樣的描述:是一個Entry[]數組類型。這是正確的,但HashMap中是使用Node作爲table,Node是Entry的實現類。Node熟悉包括:key,value,hash,next(Node)。
size:容量,最大存儲大小,也稱桶大小。
loadFactor:加載因子,默認0.75。
threshold閾值,用於判斷是否需要調整容量。threshold=“size*threshold”,當HashMap中存儲數據的數量達到threshold時,就需要將HashMap的容量加倍,出現resize(),rehash。

問2答:默認初始容量=16,默認的加載因子=0.75,也就是說默認閾值=12.

問3答:參考該文

問4答:rehash會發生在當需要擴容的時候,會resize()會觸發,對應的key的hashCode也會發生變化,這是擴容時必要的損耗。如果人爲操作禁用了resize()那麼會因爲人爲因素形成數組鏈條,這是數組+鏈表的體現。

問5答:整理出自
經常使用的構造散列函數的方法

5.1. 直接尋址法:取keyword或keyword的某個線性函數值爲散列地址。即H(key)=key或H(key) = a•key + b,當中a和b爲常數(這樣的散列函數叫做自身函數)

5.2. 數字分析法:分析一組數據,比方一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體同樣,這種話,出現衝突的機率就會非常大,可是我們發現年月日的後幾位表示月份和詳細日期的數字區別非常大,假設用後面的數字來構成散列地址,則衝突的機率會明顯減少。因此數字分析法就是找出數字的規律,儘可能利用這些數據來構造衝突機率較低的散列地址。

5.3. 平方取中法:取keyword平方後的中間幾位作爲散列地址。

5.4. 摺疊法:將keyword切割成位數同樣的幾部分,最後一部分位數能夠不同,然後取這幾部分的疊加和(去除進位)作爲散列地址。

5.5. 隨機數法:選擇一隨機函數,取keyword的隨機值作爲散列地址,通經常使用於keyword長度不同的場合。

5.6. 除留餘數法:取keyword被某個不大於散列表表長m的數p除後所得的餘數爲散列地址。即 H(key) = key MOD p, p<=m。不僅能夠對keyword直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇非常重要,一般取素數或m,若p選的不好,easy產生同義詞。

JAVA中的Objects.hashCode()默認是使用了5.6除留餘數法。所以hashMap的會與容量有關參考出自

參考:

https://www.jianshu.com/p/28cc0f676488

https://blog.csdn.net/qq_34858648/article/details/79545622

https://www.cnblogs.com/acm-bingzi/p/hash.html

https://www.cnblogs.com/skywang12345/p/3310835.html

https://www.cnblogs.com/peizhe123/p/5790252.html

http://www.cnblogs.com/mengfanrong/p/4034950.html

https://blog.csdn.net/qq876551724/article/details/78814457

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章