我在一个类(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中的dog对象的名称。在第3步,期望输出为NULL,但实际输出为Dog Key!! 我预计它会在equals()方法中失败,因为clover!=arthur,但它成功了!我注意到当hashCode成功(即长度==6)时,即使equals()方法失败,仍然检索到映射中存储的值。我改变了==并使用了equals(),但问题仍然存在。
x == y
时发出警告/错误,其中x/y的类型不是原始类型。(顺便说一句,在C#/VS中,它确实会对各种形式进行警告。)也就是说,我真的希望需要一个明确的(object)x == (object)y
形式(或其他形式)..这个问题/问题经常出现。 </rant> - user166390dog.equals(dog)
会始终为真(除非有并发修改)。 - Tom Hawtin - tackline