hashMap からインスタンスを格納および取得するために、クラス (Dog) で hashCode() および equals() をオーバーライドしました。コードは次のとおりです。
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 で hashMap 内に保存されている犬オブジェクトの名前を 1 で変更したことです。3 で期待される出力は NULL ですが、実際は Dog Key です!! equals() メソッドで clover!=arthur として失敗することを期待していますが、成功しました!! hashCode が成功すると (つまり、長さ ==6)、equals() メソッドが失敗しても、マップに格納されている値が取得されることに気付きました。代わりに == を変更して equals() を使用しましたが、変更は発生せず、問題は残ります。 .