Почему размер этого набора 1 после добавления 5 объектов? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь выяснить, почему этот код выводит 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 голосов
/ 24 октября 2018

Добавление к ответу @Eran, определение метода equals(Foo f) не переопределяет Object.equals (java.lang.Object) метод, используемый при сравнении, даже если ваш Object * Foo

public boolean equals(Foo f) {

Не вызывается в вашем коде

0 голосов
/ 24 октября 2018

Ваши определенные методы public boolean equals(Object f) и public int hashCode() в классе Foo, которые в основном говорят, что все экземпляры Foo равны друг другу, поэтому к любому HashSet можно добавить только один экземпляр Foo.

Поэтому myFooSet.size() вернет 1, независимо от количества Foo элементов, которые вы пытались добавить к нему (если вы добавили хотя бы один).

Примечание: ваш *Метод 1013 * никогда не используется HashSet, поскольку HashSet использует только метод equals, объявленный в Object class - public boolean equals(Object obj) - который вы переопределили, чтобы всегда возвращать true.

...