Прошу прояснить мои сомнения в 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<Person> sset=new HashSet<Person>();
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. Если ответ состоит в том, что оба они имеют один и тот же хеш-код, то будет вызываться только тогда равно, тогда почему его не вызывают для кода ниже
sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);
:
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: я повторил вышеуказанное значение и распечатал содержимое, но не были вызваны ни хэш-код, ни равно. когда его действительно полезно переопределить метод hashcode и equals?
Вопрос 4: Когда вызывается hashCode()
и equals()
?