【发布时间】:2019-03-28 12:36:35
【问题描述】:
我试图弄清楚为什么这段代码会输出 1:
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set<Foo> myFooSet= new HashSet<Foo>();
myFooSet.add(new Foo(2));
myFooSet.add(new Foo(1));
myFooSet.add(new Foo(3));
myFooSet.add(new Foo(3));
myFooSet.add(new Foo(2));
System.out.print(myFooSet.size());
}
}
class Foo {
Integer code;
Foo(Integer c) {
code= c;
}
public boolean equals(Foo f) {
return false;
}
public boolean equals(Object f) {
return true;
}
public int hashCode() {
return 17;
}
}
【问题讨论】:
-
因为哈希码相同并且equals返回true,所以所有5个元素都被认为是相等的并相互替换(你肯定知道集合不允许重复)。阅读
equals()和hashCode()了解更多信息。 -
@Thomas 实际上它们不会互相替换。仅添加第一个元素。
-
@Eran 是的,你是对的。我应该重新阅读 JavaDoc(“如果该集合已经包含该元素,则调用将保持集合不变并返回 false。”)-d'oh.
-
可能表明我们永远不应忽视
add(和其他类似方法)返回的值...