gpt4 book ai didi

java - 有人可以解释一下这个逻辑中的条件是否是HashMap Put方法的内部实现吗

转载 作者:行者123 更新时间:2023-12-01 11:23:39 24 4
gpt4 key购买 nike

我不明白这个逻辑中的 If 条件,即 if(current.key.equals(newKey)) 以及为什么我们需要这个 if 条件..

public void put(K newKey, V data){
if(newKey==null)
return; //does not allow to store null.

//calculate hash of key.
int hash=hash(newKey);
//create new entry.
Entry<K,V> newEntry = new Entry<K,V>(newKey, data, null);

//if table location does not contain any entry, store entry there.
if(table[hash] == null){
table[hash] = newEntry;
}else{
Entry<K,V> previous = null;
Entry<K,V> current = table[hash];

while(current != null){ //we have reached last entry of bucket.
if(current.key.equals(newKey)){
if(previous==null){ //node has to be insert on first of bucket.
newEntry.next=current.next;
table[hash]=newEntry;
return;
}
else{
newEntry.next=current.next;
previous.next=newEntry;
return;
}
}
previous=current;
current = current.next;
}
previous.next = newEntry;
}
}

有人可以解释一下如果我们不设置 if 条件会发生什么吗?

最佳答案

HashMap 被实现为一系列对应于一系列哈希码值的存储桶。每个桶都是一个链表。

为了放入一个键值对,需要先在桶中查找是否存在。为此,在 while 循环中使用条件 if(current.key.equals(newKey)) 来迭代存储桶中的链表以查找键值对 if它已经存在:

例如:

Bucket 0-99: [foo, hashcode 24 -> bar] --> [baz, hashcode 17 -> quux]
Bucket 100-199: [blah, hashcode 114 -> yadayada]

为了 put(baz, quux2),首先对 baz 进行哈希处理,此处以哈希码 17 为例。然后,映射在存储桶 0- 中进行搜索99 通过迭代。它是一个链接列表,一旦找到具有匹配键的条目,它就会更新它:

Bucket 0-99: [foo, hashcode 24 -> bar] --> [baz, hashcode 17 -> quux2]
Bucket 100-199: [blah, hashcode 114 -> yadayada]

如果它在适当的存储桶中找不到 key ,它只会将其添加到该存储桶中。

但是,current.key.hashCode()==newKey.hashCode() 的简单比较是无效的,因为可能存在哈希码冲突。哈希码仅用于选择存储桶,因此,糟糕的哈希码只会导致性能损失,而不是数据损坏。例如,总是返回 1 的极其糟糕的哈希码不会破坏映射,而只会导致其性能退化为 O(1),因为所有操作都只是链表查找、插入或更新:

Bucket 0-99: [foo, hashcode 1 -> bar] --> [baz, hashcode 1 -> quux2] --> [blah, hashcode 114 -> yadayada]

关于java - 有人可以解释一下这个逻辑中的条件是否是HashMap Put方法的内部实现吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31003613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com