我试图弄清楚为什么这段代码输出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;
}
}
答案 0 :(得分:17)
您在// To generate debug apk
gradlew assembleDebug
// To generate release apk
gradlew assembleRelease
类中定义的public boolean equals(Object f)
和public int hashCode()
方法基本上说所有Foo
实例彼此相等,因此{{1} }可以添加到任何Foo
中。
因此,Foo
将返回1,而不管您尝试添加到其中的HashSet
个元素的数量如何(只要您添加了至少一个)。
注意:myFooSet.size()
永远不会使用您的Foo
方法,因为public boolean equals(Foo f)
仅使用HashSet
类中声明的HashSet
方法-{{1} }-您必须重写以始终返回equals
。
答案 1 :(得分:2)
添加到@Eran答案中,定义equals(Foo f)
方法不会覆盖比较时使用的Object.equals(java.lang.Object)方法,即使您的对象是Foo
public boolean equals(Foo f) {
未在您的代码中调用