我在类(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();
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,在2我更改了存储在hashMap内的狗对象的名称为1,3的预期输出为NULL但实际是Dog Key !! 我希望它在equals()方法中失败,因为三叶草!=亚瑟,但它成功了!! 我注意到当hashCode成功(即lengh == 6)时,即使equals()方法失败,也会检索存储在地图中的值,我改变了==并使用了equals()代替但没有发生变化,问题仍然存在.
您想要使用.equals()not ==来比较字符串,它会比较引用.
public boolean equals(Object o) {
if ((o instanceof Dog)
&& (((Dog) o).name.equals(name))) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
另外,等于方法有点偏.如果name为null怎么办?你会得到一个空指针异常.您需要为该特殊情况添加另一个检查.