Hashcode and Equals for Hashset [дубликат]

На этот вопрос уже есть ответ здесь:

Пожалуйста, проясните мои сомнения в Hashset. Рассмотрим следующий код,

class Person
{
    String name;

    Person(String n)
    {
        name=n; 
    }
    public String getName()
    {
        return name;   
    }

    @Override
    public boolean equals(Object arg0) {

        System.out.println("in equals");

        Person obj=(Person)arg0;

        System.out.println("1st "+getName());
        System.out.println("2nd "+obj.getName());

        if(this.getName().equals(obj.getName()))
        {
                return true;
        }
        return false;
    }


    @Override
    public int hashCode() {

        System.out.println("in hash code");
        System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
        return Integer.valueOf(name.charAt(0));
    }
}

в основном у меня есть следующий код

Person obj1=new Person("bcd");

Person obj2=new Person("cde");

Person obj3=new Person("abc");

Person obj4=new Person("abc");

Теперь, если я добавляю эти объекты в hashset

Set sset=new HashSet();

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);

, я получаю этот результат

in hash code                                                                      
value is 98    
in hash code   
value is 97    
in hash code    
value is 99    
in hash code    
value is 97  
in equals  
1st abc     
2nd abc

Вопрос 1 : почему вызывается функция equals () только один раз для проверки obj3 и obj4? Почему он не проверяется на наличие остальных объектов?

Вопрос 2 : Если ответ таков, потому что они оба имеют одинаковый хэш-код, только тогда будет вызываться equals, тогда почему он не вызывается для вывода кода ниже

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);

is:

in hash code  
value is 98  
in hash code   
value is 97   
in hash code   
value is 99   
in hash code  
value is 97 

Он не попадает внутрь метода equals (), даже если два одинаковых объекта добавляются в хэш-набор с одинаковым хеш-кодом.

Вопрос 3 : Я повторил указанное выше значение и распечатал его содержимое, но не было вызвано ни хэш-кода, ни равенства. когда действительно полезно переопределить хэш-код и метод equals?

Вопрос 4 : Когда будут вызваны hashCode () и equals () ?

46
задан MatTheWhale 7 December 2017 в 01:28
поделиться