HashMap實現原理

2021-08-17 19:56:55 字數 1264 閱讀 7491

public v put(k key, v value)   

} // 如果i索引處的entry為null,表明此處還沒有entry。

modcount++;

// 將key、value新增到i索引處。

addentry(hash, key, value, i);

return

null;

}

從上面的源**中可以看出:當我們往hashmap中put元素的時候,先根據key的hashcode重新計算hash值,根據hash值得到這個元素在陣列中的位置(即下標),如果陣列該位置上已經存放有其他元素了,那麼在這個位置上的元素將以鍊錶的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果陣列該位置上沒有元素,就直接將該元素放到此陣列中的該位置上。

addentry(hash, key, value, i)方法根據計算出的hash值,將key-value對放在陣列table的i索引處。addentry 是 hashmap 提供的乙個包訪問許可權的方法,**如下:

void addentry(int hash, k key, v value, int bucketindex)
(2)獲取

public v get(object key)   

return

null;

}

有了上面儲存時的hash演算法作為基礎,理解起來這段**就很容易了。從上面的源**中可以看出:從hashmap中get元素時,首先計算key的hashcode,找到陣列中對應位置的某一元素,然後通過key的equals方法在對應位置的鍊錶中找到需要的元素。

3) 歸納起來簡單地說,hashmap 在底層將 key-value 當成乙個整體進行處理,這個整體就是乙個 entry 物件。hashmap 底層採用乙個 entry 陣列來儲存所有的 key-value 對,當需要儲存乙個 entry 物件時,會根據hash演算法來決定其在陣列中的儲存位置,在根據equals方法決定其在該陣列位置上的鍊錶中的儲存位置;當需要取出乙個entry時,也會根據hash演算法找到其在陣列中的儲存位置,再根據equals方法從該位置上的鍊錶中取出該entry。

ha****erator()   

}

在迭代過程中,判斷modcount跟expectedmodcount是否相等,如果不相等就表示已經有其他執行緒修改了map:

注意到modcount宣告為volatile,保證執行緒之間修改的可見性。

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實現原理

hashmap底層是通過陣列加鍊表的方式實現的,首先假如定義乙個陣列長度為5,當新增元素時,根據key的hashcode值 5進行取餘,如果餘值為3,則放在陣列的第四個位置,如果第四個位置已經有值,則會發生hash碰撞問題,所以hashmap又採用了鍊錶的方式進行儲存,如果key值存在則覆蓋,如果不...