【发布时间】:2012-08-28 06:35:21
【问题描述】:
关于java.util.Set.contains(Object o) 的doc 说:
当且仅当此集合包含元素 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
【问题讨论】: