gpt4 book ai didi

java - hashcode() 和 equals() 在 java 中的工作?

转载 作者:行者123 更新时间:2023-11-29 07:54:51 26 4
gpt4 key购买 nike

这是我们将用来放入 hasmap 的类。它覆盖了 equals()hashcode() 方法。

class Dog
{
public String name;
public Dog(String n)
{
name=n;
}
@Override
public int hashCode() {
System.out.println("in hashcode");
return name.length();
}
@Override
public boolean equals(Object obj) {
System.out.println("in equals");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}


}

主要代码

Map<Object,Object> m=new HashMap<Object,Object>();
Dog d1=new Dog("clover");
m.put(d1,"Dog Key");
System.out.println(m.get(d1));

产生

in hashcode
in hashcode
Dog Key

但是下面的代码

Map<Object,Object> m=new HashMap<Object,Object>();
Dog d1=new Dog("clover");
m.put(d1,"Dog Key");
System.out.println(m.get(new Dog("clover")));

产生

in hashcode
in hashcode
in equals
Dog Key

如您所见,在第二个输出中调用了 equals() 方法。为什么会这样?
我的第二个问题
如果我更改 key 的名称属性映射 m=new HashMap();

Dog d1=new Dog("clover");
m.put(d1,"Dog Key");

d1.name="arthur";
System.out.println(m.get(new Dog("clover")));

O/P 是

in hashcode
in hashcode
in equals
null

即使我已经更改了键值,但我正在尝试通过提供相同的键来检索该值。那为什么会返回null呢?

最佳答案

对于第一个问题:HashMap 需要调用equals() 来确认两个Dog 对象具有相同的hash代码实际上是相等的。它不需要第一次调用 equals(),因为它使用 == 来检查使用与先前指定的完全相同的对象的特殊情况。

对于第二个问题:你改变了一个数据成员,它改变了散列码的计算和equals()的结果。这是特别违反规则的,结果 map 被破坏了;到那时,任何事情都有可能发生。切勿将具有可变数据的对象用作 HashMap 中的键!

关于java - hashcode() 和 equals() 在 java 中的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560459/

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