HashMap的儲存結構及原理

2021-08-27 19:54:11 字數 2761 閱讀 4102

1、hashmap的資料結構(hashmap通過hashcode對其內容進行快速查詢,是無序的)

資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。

陣列 :陣列的儲存區是連續的,占用記憶體嚴重,故空間複雜度很大。但陣列的二分查詢時間度小;陣列的特點:定址容易,插入和

刪除困難。

鍊錶 :鍊錶的儲存區離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度大;鍊錶的特點:定址困難,插入和刪除容易。

雜湊表

hashmap

是由陣列+鍊錶組成;定址容易,插入和刪除容易。(儲存單元陣列entry,陣列裡面包含鍊錶

hashmap其實也是由乙個線性的陣列實現的。所以可以理解為其儲存資料的容器就是乙個線性容器;

hashmap裡面有乙個內部靜態類entry,其重要的屬性有key,value,next,從屬性key,value 就可以很明顯的看出來 entry就是

hashmap鍵值對實現的乙個基礎bean;也就是說hashmap的基礎就是乙個線性陣列,這個陣列就是entry,map裡面的內容都儲存

在entry中;

/**

* the table, resized as necessary. length must always be a power of two.

*/transient entry table;

2、hashmap的訪問實現

2.1:儲存

這裡hashmap用了乙個演算法。

//儲存時候:

int hash=key.hashcode();//獲取key的hashcode,這個值是乙個固定的int值

int index=hash%entry.length;//獲取陣列下標:key的hash值對entry陣列長度進行取餘

entry[index]=value;

注意:如果兩個key通過hash%entry.length得到的index相同,會不會覆蓋?

是不會的。entry類有乙個next屬性,作用是指向下乙個entry。打個比方, 第乙個鍵值對a進來,通過計算其key的hash得到的

index=0,記做:entry[0] = a。一會後又進來乙個鍵值對b,通過計算其index也等於0,現在怎麼辦?hashmap會這樣做:b.next =

a,entry[0] = b,如果又進來c,index也等於0,那麼c.next = b,entry[0] = c;這樣我們發現index=0的地方其實訪問了a,b,c三個鍵值對,他

們通過next這個屬性鏈結在一起。所以疑問不用擔心。

也就是說entry陣列中儲存的是最後插入的資料

public v put(k key, v value) 

}modcount++;

addentry(hash, key, value, i);

return null;

}void addentry(int hash, k key, v value, int bucketindex)

2.2:取值

獲取key的hashcode指,通過hash值去hash%entry.length 獲取entry[hash%entry.length],定位到該陣列元素之後,再遍歷該元

素處的鍊錶。

//取值時候:

int hash=key.hashcode();

int index =hash%entry.length;

return entry[index];

public v get(object key) 

return null;

}

當雜湊表的容量超過預設容量時,必須要調整table的大小。當容量達到最大值時,該方法integer.max_value返回,這時,就需要

建立

一張表,將原來的表對映到新錶中。

3、hashmap、hashtable和concurrenthashmap的執行緒安全問題

hashmap:執行緒不安全的。

hashtable:鎖住整張hash表,讓執行緒獨佔。hashmap允許為空。通過分析hashtable就知道,synchronized是針對整張hash表的,即每次

鎖住整張表

讓執行緒獨佔,安全的背後是巨大的浪費。

concurrenthashmap:乙個更快的hashmap,它提供了好得多的併發性。多個讀操作幾乎總可以併發地執行。他是鎖段(預設:把hash

表分為16個

,在get,put,remove等操作中,concurrenthashmap只鎖定當前需要用到的段,只有在求size的時候才鎖定

整張hash表。

準備 HashMap 的資料結構及儲存原理

hashmap的資料結構 陣列 優點 儲存區間連續,定址容易 按下標隨機訪問效率高o 1 缺點 占用記憶體嚴重,插入刪除困難 鍊錶 優點 儲存位址不連續,可寬展空間,插入,刪除效率高 缺點 訪問效率低 o n 雜湊表 綜合了陣列和鍊錶的特性,既定址容易,插入刪除效率又高 問題 什麼是hashmap?...

HashMap儲存原理

hashmap儲存的資料存放在記憶體中,提高hashmap資料定址速度是重點要解決的問題,所以hashmap底層的儲存結構非常關鍵,如果使用陣列儲存,時間複雜度為 1 使用鍊錶儲存,時間複雜度為o n 如果使用二叉樹儲存,時間複雜度為o lg n 所以hashmap優先使用陣列儲存,如果出現hash...

HashMap的儲存原理

hashmap是乙個陣列加鍊表的結構構成。模運算 效率低 index hashcode table.length 在容量擴容為兩倍時,需要再次rehash確定每個元素位置,浪費效能。位運算 效率高 index hashcode table.length 1 index的值完全取決於key的hashc...