hashmap是乙個陣列加鍊表的結構構成。
模運算(效率低):index=hashcode%table.length
在容量擴容為兩倍時,需要再次rehash確定每個元素位置,浪費效能。
位運算(效率高):index=hashcode&table.length-1
index的值完全取決於key的hashcode最後幾位,而且效果等同於取模運算。
陣列儲存空間是連續的,占用記憶體嚴重,空間複雜度大,二分法時間複雜度小,查詢容易,插入和刪除困難。
鍊錶儲存空間離散,占用記憶體比較寬鬆,空間複雜度小,時間複雜度大,查詢困難,插入和刪除簡單
雜湊表(hashtable)由陣列和鍊錶構成,既滿足了資料查詢方便,又不用占用太多記憶體,通過key獲取hashcode值,再取模的規則儲存到陣列中。
hashmap是乙個線性陣列實現,裡面實現了乙個靜態內部類entry(鍵值對物件),其重要屬性有key、value、next,從屬性key、value就可以看出來entry是hashmap鍵值對實現的乙個繼承bean(類)。這個線性陣列被儲存在entry中。
put()方法是通過key的hashcode方法去bucket(儲存空間)對應位置儲存entry物件,如果兩個key通過hash%entry.length得到的index相同,我們就通過他的next屬性,以鏈的形式把值銜接在一起,通過key的equals()來尋找相同hashcode下對應的值,如果key相同,hashcode相同,再插入時,值會被直接替換,而且hashmap內部設定了乙個影響因子0.75,在hashmap儲存值的長度超過這個影響因子,hashmap會按照hash的分布均勻原則自動擴容,haspmap的預設初始長度為16.
get()方法是根據key的值來查詢對應點的value,當呼叫get()方法時,對key做一次hash對映,算出對應的index的值,如果同乙個位置存在多個entry物件,就要從鍊錶的頭節點往下找,找到對應key值為止。
HashMap儲存原理
hashmap儲存的資料存放在記憶體中,提高hashmap資料定址速度是重點要解決的問題,所以hashmap底層的儲存結構非常關鍵,如果使用陣列儲存,時間複雜度為 1 使用鍊錶儲存,時間複雜度為o n 如果使用二叉樹儲存,時間複雜度為o lg n 所以hashmap優先使用陣列儲存,如果出現hash...
HashMap的儲存結構及原理
1 hashmap的資料結構 hashmap通過hashcode對其內容進行快速查詢,是無序的 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列的儲存區是連續的,占用記憶體嚴重,故空間複雜度很大。但陣列的二分查詢時間度小 陣列的特點 定址容易,插入和 刪除困難。鍊錶 鍊...
HashMap底層(1 7和1 8)的儲存原理
首先說一下jdk1.7版本的存放原理 當例項化後,底層會直接建立乙個長度為16的一維陣列entry table 然後,說一下新增元素時,呼叫put方法 三種情況儲存 方式一 底層根據key計算hash值,計算出索引位置,檢視當前位置是否有值,如果沒有值,直接存放。情況二 當計算出的索引位置,有值時 ...