Я понимаю основную концепцию переопределения hashcode и equals в классе. Но может ли кто-нибудь дать мне пример (код), где equals будет терпеть неудачу только потому, что hashcode не был переопределен? Спасибо заранее.HashCode и Equals в Java
ответ
Это не то, что equals
сам потерпит неудачу - все, что зависит от договора hashCode
, и его отношение к equals
может потерпеть неудачу. Вот пример:
import java.util.*;
final class Person {
private final String name;
public Person(String name) {
// TODO: Nullity prohibition
this.name = name;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != Person.class) {
return false;
}
return name.equals(((Person)other).name);
}
}
class Test {
public static void main(String[] args) throws Exception {
Person p1 = new Person("Jon");
Person p2 = new Person("Jon");
System.out.println(p1.equals(p2)); // true
Set<Person> people = new HashSet<Person>();
people.add(p1);
people.add(p2);
System.out.println(people.size()); // 2!
}
}
HashSet
предполагает, что из-за p1.hashCode()
не то же самое, как p2.hashCode()
, эти два элемента должны быть равны, так как может быть в комплекте. Этого не произойдет, если hashCode()
были соответственно переопределены.
Аналогичным образом вы могли бы иметь (с тем же классом Person
);
Map<Person, String> map = new HashMap<Person, String>();
map.put(p1, "foo");
System.out.println(map.get(p2)); // null
Это бы распечатывают «Foo», если два объекта возвращается равные коды хэша, как они предназначены для - но опять же, потому что они не делают, то HashMap
думает, что нет матча.
Eric Lippert's blog post on GetHashCode
- хорошее введение в это - это на C#, но оно в равной степени относится к Java.
Спасибо. Я понимаю сейчас – user2584920
Если ваш equals терпит неудачу, это связано с тем, что вы внесли неправильный характер.
Вот как это сделать правильно: answer до What issues should be considered when overriding equals and hashCode in Java?.
, но просто для удовольствия здесь является примером равенства метод, который потерпит неудачу, если хэш-код не переопределяется:
//NEVER DO THIS
@Override
public boolean equals(Object o){
ThisObject obj = (ThisObject)o;
return this.hashCode() == obj.hashCode();
}
- 1. Реализация hashCode и equals в int [] Java
- 2. Переопределение метода hashcode и equals в java?
- 3. Работа hashcode() и equals() в java?
- 4. Метод HashCode и Equals в объекте Java
- 5. Карта HashCode и Equals
- 6. equals() без hashCode()
- 7. SCJP HashCode() и Equals() Путаница
- 8. Hashcode и equals methods contract
- 9. Подробнее о equals и hashCode
- 10. Поток выполнения Equals и HashCode
- 11. equals() и hashCode() в Java LinkedHashMap и древовидная карта?
- 12. Вызов hashCode() from equals()
- 13. Как реализовать метод hashCode и equals
- 14. Почему существуют как hashCode(), так и equals()
- 15. Исполнение Hashcode() и equals() в классе вида
- 16. Debug equals() и hashCode() в Eclipse
- 17. Динамически переопределять `equals` и` hashCode` в groovy
- 18. Реализация Equals и hashCode для моих объектов в Java
- 19. Связь между методом hashCode и equals в Java
- 20. В Java, почему equals() и hashCode() должны быть последовательными?
- 21. Какие классы в java являются переопределяющими методами equals() и hashCode()?
- 22. HashMap overriding equals and hashcode
- 23. Java 8 - Методы по умолчанию для equals и hashcode
- 24. Java HashMap с переопределенным hashCode() и equals() возвращает данные
- 25. Java overriding equals() и hashcode() для двух взаимозаменяемых целых чисел
- 26. Открытое тестирование pojo для equals и hashcode
- 27. Google App Engine, JDO и equals/hashCode
- 28. Когда мне нужен метод hashcode и equals?
- 29. Комбинирование hashCode() и equals() выполняется быстрее?
- 30. Различать подклассы через equals & hashcode
Вы не будете иметь такой код. equals не может потерпеть неудачу, потому что hashcode не переопределяется. – mael