为什么在添加5个对象后此集合的大小为1?

时间:2018-10-24 07:26:20

标签: java hashmap hashset

我试图弄清楚为什么这段代码输出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;
     }
}

2 个答案:

答案 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) {

未在您的代码中调用