, как для определения лица:как переопределить этот метод hashCode?
public class Person {
private int id;
private int characteristics;
public boolean equals (Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Person) {
if (id == ((Person) obj).id) {
return true;
} else if (characteristics == ((Person) obj).characteristics) {
return true;
}
}
return false;
}
}
причина 2 Person
объекты a
и b
должны иметь одинаковый хеш-код, если a.equals(b)
возвращает true
, как я должен реализовать метод hashCode
?
решение
мой equals
реализация метода является неправильным в соответствии с протоколом эквивалентности в Java: транзитивности не удовлетворен: a.id = 1
, a.characteristic = 2
, b.id = 1
, b.characteristic = 3
, c.id = 2
, c.characteristic = 3
; a.equals(b) == true
, b.equals(c) == true
, но a.equals(c) == false
.
Вы можете XOR переменные id и характеристик. –
Для записи вы можете преобразовать второй набор этих 'if' в return, т.е. 'return obj instanceof Person && (id == ((Person) obj) .id || характеристики == ((Person) obj). характеристики);'. Вы также должны позаботиться о том, чтобы 'return false' в конце вашего текущего кода, так как ваш метод' equals' может работать, не возвращая ничего. – SimplyPanda
@SimplyPanda Это совершенно неправильно на первом. 'return obj == this;' будет возвращать false, если 'obj' - не тот же экземпляр, но все равно может быть равен по значению. – cdhowie