2013-07-15 2 views
0

Я понимаю основную концепцию переопределения hashcode и equals в классе. Но может ли кто-нибудь дать мне пример (код), где equals будет терпеть неудачу только потому, что hashcode не был переопределен? Спасибо заранее.HashCode и Equals в Java

+1

Вы не будете иметь такой код. equals не может потерпеть неудачу, потому что hashcode не переопределяется. – mael

ответ

5

Это не то, что 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.

+0

Спасибо. Я понимаю сейчас – user2584920

0

Если ваш 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(); 
} 
Смежные вопросы