22 hash表的介紹 上

2021-09-17 23:45:15 字數 1003 閱讀 4686

1. 散列函式計算得到的散列值是乙個非負整數;

2. 如果 key1 = key2,那 hash(key1) == hash(key2);

3. 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。

1. 初始大小

hashmap 預設的初始大小是 16,當然這個預設值是可以設定的,如果事先知道大概的資料量有

多大,可以通過修改預設初始大小,減少動態擴容的次數,這樣會大大提高 hashmap 的效能。

2. 裝載因子和動態擴容

最大裝載因子預設是 0.75,當 hashmap 中元素個數超過 0.75*capacity(capacity 表示散列

表的容量)的時候,就會啟動擴容,每次擴容都會擴容為原來的兩倍大小。

3. 散列衝突解決方法

hashmap 底層採用鍊錶法來解決衝突。即使負載因子和散列函式設計得再合理,也免不了會出

現拉鍊過長的情況,一旦出現拉鍊過長,則會嚴重影響 hashmap 的效能。

於是,在 jdk1.8 版本中,為了對 hashmap 做進一步優化,我們引入了紅黑樹。而當鍊錶長度

太長(預設超過 8)時,鍊錶就轉換為紅黑樹。我們可以利用紅黑樹快速增刪改查的特點,提高

hashmap 的效能。當紅黑樹結點個數少於 8 個的時候,又會將紅黑樹轉化為鍊錶。因為在資料

量較小的情況下,紅黑樹要維護平衡,比起鍊錶來,效能上的優勢並不明顯。

4. 散列函式

散列函式的設計並不複雜,追求的是簡單高效、分布均勻。

int hash(object key)

乙個工業級的hashmap 的實現需要考慮的事情?

支援快速的查詢、插入、刪除操作;

記憶體占用合理,不能浪費過多的記憶體空間;

效能穩定,極端情況下,散列表的效能也不會退化到無法接受的情況

設計乙個合適的散列函式;

定義裝載因子閾值,並且設計動態擴容策略;

選擇合適的散列衝突解決方法

暴雪的hash表

具體流程就是建立乙個較大的陣列,然後通過特定的演算法,將字串轉成整數,然後存入到這個陣列中,然後可以通過取模,獲得這個string在陣列中的下標。include include include define maxmpqhashtablelen 8192 typedef struct mpqhash...

hash表的理解

hash演算法可以把檔案轉換成一行字串,而且每個檔案有單獨的hash值,基本不會重複,這樣通過計算兩個檔案的hash值可以很快的確定兩個檔案是否相同。hash的運算只能從檔案到hash值,但是從hash值到檔案是幾乎不可能的。修改檔案和字尾名不會改變檔案的hash值。常用的hash演算法有md5和s...

hash表的使用

事實上不管使用陣列還是鍊錶儲存資料都會存在較大缺陷,當你使用陣列時,難於刪除和新增資料 當你使用鍊錶時難於查詢資料 因此hash表綜合了兩者的優缺點,使的查詢和新增等操作既不至於複雜也不至於簡單。因此hash表的原理可以是陣列中存鍊錶,鍊錶上存資料 簡單的建立方式如下 public class hn...