鉴于类Foo这种果断差的hashCode()实现:为什么返回零的hashCode()会导致List.minus()返回空列表?
class Foo {
String name
public int hashCode() {
0
}
public boolean equals(Object obj) {
if (obj == null) {
return false
}
if (!(obj instanceof Foo)) {
return false
}
Foo foo = (Foo) obj
return this.name.equals(foo.name)
}
}
为什么以下断言失败?
Foo f1 = new Foo(name: 'Name 1')
Foo f2 = new Foo(name: 'Name 2')
Foo f3 = new Foo(name: 'Name 2')
assert ([f1, f2] - [f3]).size() == 1
minus()
的结果是一个空列表。如果我将hashCode()实现切换到return name.hashCode()
,则断言通过。无论是哪种实现,像这样的方法都可以按预期工作。
我的问题是不是如何实现一个更好的hashCode(),但为什么minus()
表现这种方式。
你打败了我。 :) +1 – dmahapatro
虽然,如果我们只做'[f1,f2] - f3',就不会发生这种情况。 :) – dmahapatro
在这种情况下,“equals()”是如何考虑的?我在equals/hashCode合约中的假设是,当对象符合equals()合约时,它们的hashCode必须相等。但是,具有相同散列码的对象不一定相等。 – mwersch