【发布时间】:2011-12-21 21:43:15
【问题描述】:
以下怎么可能:
void contains(LinkedHashSet data, Object arg) {
System.out.println(data.getClass()); // java.util.LinkedHashSet
System.out.println(arg.hashCode() == data.iterator().next().hashCode()); // true
System.out.println(arg.equals(data.iterator().next())); // true
System.out.println(new ArrayList(data).contains(arg)); // true
System.out.println(new HashSet(data).contains(arg)); // true
System.out.println(new LinkedHashSet(data).contains(arg)); // true (!)
System.out.println(data.contains(arg)); // false
}
我做错了吗?
显然,它并不总是会发生(如果您创建了一组微不足道的对象,您将不会重现它)。但在我的情况下,它总是会发生更复杂的 arg 类。
编辑:我在这里不定义arg 的主要原因是它的类相当大,Eclipse 生成的hashCode 跨越20 行,equals 长两倍.而且我认为这无关紧要——只要它们对两个对象相等即可。
【问题讨论】:
-
如果参数是
set和arg,那么data是什么?你在里面放了什么样的对象?如果是您自己的对象,您是否正确覆盖了equals()和hashCode()? -
另外你为什么在倒数第二行检查
contains(file),但在最后一行检查contains(arg)?file是什么? -
stivlo,咄咄逼人 - 两者都只是复制/粘贴时的拼写错误,已修复。
标签: java collections set linkedhashset