Javaでequalsを実装するとき -失敗するとcontainsが動かない-
hashCodeはもちろん実装しましょう。
で、
public class 俺のクラス {
private String ore;
public 俺のクラス (String ore) {
this.ore = ore;
}
public boolean equals(俺のクラス o) {
return ore.equals(o.getOre());
}
...
}
ってやったらダメ。一見まともに動くんですが…
俺のクラス o1 = new 俺のクラス("hoge");
俺のクラス o2 = new 俺のクラス("hoge");
俺のクラス o3 = new 俺のクラス("foo");
// true
o1.equals(o2);
// false
o1.equals(o3);
Correctionのcontainsがちゃんと動かない。
Set<俺のクラス> os = new HashSet<>();
os.add(o1);//もちろんtrue
os.contains(o1);
//trueになるかとおもいきやfalse
os.contains(o2);
正しいequalsの実装はこう。
public boolean equals(Object o) {
ほげほげ
}
こんなところでしばらくハマってしまった…
ちなみにはまってる間、色々調べていてわかったのですが、
HashSetって内部的には単一のObjectをValueにもってるHashMapなんですね。(java7だと)
Mapのキーの管理にSet使うならわかるんだけど実態は逆で不思議。