The doc http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#contains(java.lang.Object) about java.util.Set.contains(Object o)
says:
当且仅当该集合包含元素 e 且满足以下条件时返回 true
(o==null ? e==null : o.equals(e))。
也就是说,这是一个 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