HashMap實現原理複習

2021-09-25 02:23:14 字數 1615 閱讀 3238

1.hashmap的內部實現機制

hashmap是對資料結構中雜湊表(hash table)的實現,hash表又叫雜湊表。hash表是根據關鍵碼key來訪問其對應的值value的資料結構,它通過乙個對映函式把關鍵碼對映到表中乙個位置來訪問該位置的值,從而加快查詢的速度。這個對映函式叫做hash函式,存放記錄的陣列叫做hash表。

static class entryimplements map.entry
在hashmap的建構函式中可以看到,entry表被申明為了陣列,如以下**所示:

public hashmap()
在以上建構函式中,預設的default_initial_capacity值為16,default_load_factor的值為0.75。當put乙個元素到hashmap中去時,其內部實現如下:

public v put(k key, v value)
可以看到put函式中用乙個hash函式來得到雜湊值,需要指出的是,hashtable在實現時直接用了hashcode作為雜湊值,因此採用hashmap代替hashtable有一定的優化

put函式中用到的兩個函式hash和indexfor其實現分別如下:

static int hash(int h)
/** 

* returns index for hash code h.

*/

static int indexfor(int h, int length)

至於hash函式為什麼這樣設計,這涉及到具體雜湊函式的設計問題了,需要考慮的是雜湊演算法的時間複雜度,同時盡量使得陣列上每個位置都有值,求得時間和空間的最優

indexfor函式則用了乙個很巧妙的與運算將index值限制在了length-1之內。

當然,hash函式存在衝突的情況,同乙個key對應的hash值可能相同,這時候hash值相同的元素就會用鏈結進行儲存,hashmap的get方法在獲取value的時候會對鍊錶進行遍歷,把key值相匹配的value取出來。

2.hash的實現

主要是雜湊演算法和衝突的解決。

3.什麼時候rehash

在介紹hashmap的內部實現機制時提到了兩個引數,default_initial_capacity和default_load_factor,default_initial_capacity是table陣列的容量,default_load_factor則是為了最大程度避免雜湊衝突,提高hashmap效率而設定的乙個影響因子,將其乘以default_initial_capacity就得到了乙個閾值threshold,當hashmap的容量達到threshold時就需要進行擴容,這個時候就要進行rehash操作了,可以看到下面addentry函式的實現,當size達到threshold時會呼叫resize函式進行擴容。

void addentry(int hash, k key, v value, int bucketindex)
在擴容的過程中需要進行rehash操作,而這是非常耗時的,在實際中應該盡量避免。

HashMap實現原理

hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...

HashMap實現原理

資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...

HashMap實現原理

public v put k key,v value 如果i索引處的entry為null,表明此處還沒有entry。modcount 將key value新增到i索引處。addentry hash,key,value,i return null 從上面的源 中可以看出 當我們往hashmap中put...