についてのドキュメントjava.util.Set.contains(Object o)
は言う:
このセットに(o == null?e == null:o.equals(e))のような要素eが含まれている場合にのみtrueを返します。
そうは言っても、ここにPOJOがあります(ご覧のとおり、私はそのequals
メソッドを上書きしました):
public class MonthAndDay {
private int month;
private int day;
public MonthAndDay(int month, int day) {
this.month = month;
this.day = day;
}
@Override
public boolean equals(Object obj) {
MonthAndDay monthAndDay = (MonthAndDay) obj;
return monthAndDay.month == month && monthAndDay.day == day;
}
}
では、なぜ次のコードがfalse
代わりに出力されるのtrue
ですか?
Set<MonthAndDay> set = new HashSet<MonthAndDay>();
set.add(new MonthAndDay(5, 1));
System.out.println(set.contains(new MonthAndDay(5, 1)));
// prints false
解決策はメソッドを書き直すことですcontains(Object o)
が、元のメソッドは(ほぼ)まったく同じである必要があります、私は間違っていますか?
Set<MonthAndDay> set = new HashSet<MonthAndDay>() {
private static final long serialVersionUID = 1L;
@Override
public boolean contains(Object obj) {
MonthAndDay monthAndDay = (MonthAndDay) obj;
for (MonthAndDay mad : this) {
if (mad.equals(monthAndDay)) {
return true;
}
}
return false;
}
};
set.add(new MonthAndDay(5, 1));
System.out.println(set.contains(new MonthAndDay(5, 1)));
// prints true