- HashMap通過鍵的hashCode來快速的存取元素。
- 當不同的對象hashCode發生碰撞時,HashMap通過單鏈表來解決,將新元素加入鏈表表頭,通過next指向原有的元素。 單鏈表在Java中的實現就是對象的引用(復合)。
public V put(K key, V value) {
???? // 處理key為null,HashMap允許key和value為null
???? if (key == null)
????????? return putForNullKey(value);
???? // 得到key的哈希碼
???? int hash = hash(key);
???? // 通過哈希碼計算出bucketIndex
???? int i = indexFor(hash, table.length);
???? // 取出bucketIndex位置上的元素,并循環單鏈表,判斷key是否已存在
???? for (Entry<K,V> e = table[i]; e != null; e = e.next) {
????????? Object k;
????????? // 哈希碼相同并且對象相同時
????????? if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
?????????????? // 新值替換舊值,并返回舊值
?????????????? V oldValue = e.value;
?????????????? e.value = value;
?????????????? e.recordAccess(this);
?????????????? return oldValue;
????????? }
???? }
???? // key不存在時,加入新元素
???? modCount++;
???? addEntry(hash, key, value, i);
???? return null;
}
???? // 處理key為null,HashMap允許key和value為null
???? if (key == null)
????????? return putForNullKey(value);
???? // 得到key的哈希碼
???? int hash = hash(key);
???? // 通過哈希碼計算出bucketIndex
???? int i = indexFor(hash, table.length);
???? // 取出bucketIndex位置上的元素,并循環單鏈表,判斷key是否已存在
???? for (Entry<K,V> e = table[i]; e != null; e = e.next) {
????????? Object k;
????????? // 哈希碼相同并且對象相同時
????????? if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
?????????????? // 新值替換舊值,并返回舊值
?????????????? V oldValue = e.value;
?????????????? e.value = value;
?????????????? e.recordAccess(this);
?????????????? return oldValue;
????????? }
???? }
???? // key不存在時,加入新元素
???? modCount++;
???? addEntry(hash, key, value, i);
???? return null;
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
