以下如何可能:
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
两倍。而且我认为这无关紧要-只要它们对两个对象相等即可。