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...