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

Jav*_*yer 4 java scjp hashmap

我在类(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()代替但没有发生变化,问题仍然存在.

Ole*_*ksi 5

您想要使用.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怎么办?你会得到一个空指针异常.您需要为该特殊情况添加另一个检查.