gpt4 book ai didi

java - HashMap 如何在不调用 equals 方法的情况下替换键的值

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:52 24 4
gpt4 key购买 nike

public class Test
{
public static void main(String[] args) {
Employee e1=new Employee(1);
Employee e2=new Employee(1);
HashMap<Employee,String> map=new HashMap<Employee,String>();
map.put(e1, "A");
map.put(e1, "B");
map.put(e2, "C");
}
}
class Employee{
private int id;
Employee(int id){
this.id=id;
}

@Override
public int hashCode() {
System.out.println("hascode is ="+this.id);
return this.id;
}
@Override
public boolean equals(Object obj) {
System.out.println("Equals");
return super.equals(obj);
}
}

当我再次放置同一个对象 e1 时,没有调用 equals() 方法,那么如何在不检查 map 现有对象的情况下将值 B 替换为键 e1? (我想这是 equals 方法的工作)

最佳答案

Object.equals 方法的契约要求实现是自反:

It is reflexive: for any non-null reference value x, x.equals(x) should return true.

这意味着 HashMap 实现被允许,事实上,总是首先使用 == 进行比较,并且只调用 equals如果该比较不是 true,则返回方法。因此,如果您使用完全相同的对象 e1 替换键 e1 的值,它只会使用 == 比较,而不会调用 equals 方法。

如果您查看为键设置值的 HashMap 实现,您会发现此语句有两次变体:

if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;

(一次用于哈希桶中的第一个键,然后循环迭代哈希桶中的任何其他键)

关于java - HashMap 如何在不调用 equals 方法的情况下替换键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906599/

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