gpt4 book ai didi

java - 覆盖 hashCode() 和 equals() 以将对象存储在 hashMap 中无法正常工作

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

我重写了类 (Dog) 中的 hashCode() 和 equals() 以便从 hashMap 中存储和检索它的实例,代码如下:

class Dog {

public Dog(String n) {
name = n;
}
public String name;

public boolean equals(Object o) {
if ((o instanceof Dog)
&& (((Dog) o).name == name)) {
return true;
} else {
return false;
}
}

public int hashCode() {
return name.length();
}
}

而hashMap代码如下:

public class MapTest {

public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
m.put("k1", new Dog("aiko"));
Dog d1 = new Dog("clover");
m.put(d1, "Dog key"); // #1
System.out.println(m.get("k1"));
String k2 = "k2";
d1.name = "arthur"; // #2
System.out.println(m.get(d1)); #3
System.out.println(m.size());
}
}

问题是,在 2 处我更改了存储在 1 处的 hashMap 中的狗对象的名称,在 3 处的预期输出是 NULL 但实际是 Dog Key!!我希望它在 equals() 方法中失败,因为 clover!=arthur 但它成功了!!我注意到当 hashCode 成功时(即 lengh==6)即使 equals() 方法失败,存储在 map 中的值也会被检索,我更改了 == 并改用 equals() 但没有发生任何变化,问题仍然存在.

最佳答案

您想使用 .equals() 而不是 == 来比较字符串,它比较引用。

public boolean equals(Object o) {
if ((o instanceof Dog)
&& (((Dog) o).name.equals(name))) {
return true;
} else {
return false;
}
}

此外,equals 方法也有点不对劲。如果名称为空怎么办?你会得到一个空指针异常。您需要为该特殊情况添加另一项检查。

关于java - 覆盖 hashCode() 和 equals() 以将对象存储在 hashMap 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768673/

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