作者:北斗盖全球 | 来源:互联网 | 2022-12-01 15:28
我想弄清楚为什么这段代码输出1:
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set myFooSet= new HashSet();
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;
}
}
Eran..
17
你的定义public boolean equals(Object f)
和public int hashCode()
在方法Foo
类,基本上说,所有Foo
情况下都彼此相等,所以只有一个实例Foo
可以被添加到任何HashSet
.
因此myFooSet.size()
,无论Foo
您尝试添加的元素数量是多少,都将返回1 (只要您添加了至少一个元素).
注意:您的public boolean equals(Foo f)
方法永远不会被使用HashSet
,因为HashSet
只使用equals
在Object
类中声明的方法public boolean equals(Object obj)
- 您覆盖的方法总是返回true
.
1> Eran..:
你的定义public boolean equals(Object f)
和public int hashCode()
在方法Foo
类,基本上说,所有Foo
情况下都彼此相等,所以只有一个实例Foo
可以被添加到任何HashSet
.
因此myFooSet.size()
,无论Foo
您尝试添加的元素数量是多少,都将返回1 (只要您添加了至少一个元素).
注意:您的public boolean equals(Foo f)
方法永远不会被使用HashSet
,因为HashSet
只使用equals
在Object
类中声明的方法public boolean equals(Object obj)
- 您覆盖的方法总是返回true
.
显式的另一个重要细节是从不调用`equals(Foo)`重载,因为HashMap无法知道存在,所以`equals(Object)`是被调用的重载.因此,虽然`new Foo(1).equals(new Foo(1))`是假的,但实际上从未使用过.