На этот вопрос уже есть ответ здесь:
Пожалуйста, проясните мои сомнения в 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 ()
?