gpt4 book ai didi

java - HashMap 重新哈希会处理修改后的键吗?

转载 作者:行者123 更新时间:2023-12-02 04:07:38 24 4
gpt4 key购买 nike

我编写了一个示例程序来测试这一点。我添加了一些键值对并更改了其中一个键,之后我插入了更多超过阈值的键值对。因此,应该进行重新哈希,当我用更改后的 key 查找时,理想情况下我应该得到正确的值。但我没有正确理解。有人可以帮我解决我缺少的地方吗?

public class HashMapTest {

public static void main(String[] args) {

Map<Employee, String> map = new HashMap<Employee, String>();
Employee obj = null;

for(int i=1; i< 5; i++) {
Employee emp = new Employee();
emp.setId(i);
emp.setName("vamsi"+i);
map.put(emp, emp.getName());
if(obj == null && i == 3) {
obj = emp;
System.out.println(obj.hashCode());
}
}

System.out.println("Before changing the key: "+map.get(obj));
obj.setId(15);
System.out.println(hash(obj.hashCode()));
for(int i=20; i< 45; i++) {
Employee emp = new Employee();
emp.setId(1+i);
emp.setName("vamsi"+i);
map.put(emp, emp.getName());
}
System.out.println("After changing the key: "+map.containsKey(obj));
Set<Map.Entry<Employee, String>> ent = map.entrySet();
for(Map.Entry<Employee, String> ent1 : ent) {
System.out.println(ent1.getValue()+ " " +ent1.getKey().hashCode());

}
}

public void capacityTest() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("vamsi", "vamsi");

for(int i=1; i< 14; i++) {
map.put("vamsi"+i, "vamsi");
}

System.out.println(map.size());
}

static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
}


class Employee {

private int id;
private String name;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
int result = 1;
result = 2 * id * name.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
Employee other = (Employee) obj;
if (id != (other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}

最佳答案

在 Java 8 中,Employee.hashCode() 被缓存。

// from the source for HashMap.Node
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;

这意味着,如果您更改对象中的 hashCode,它实际上不会更改数据结构,直到您(成功)删除它并将其添加回来。

关于java - HashMap 重新哈希会处理修改后的键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104469/

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