Il n'est pas toujours nécessaire de remplacer hashcode et equals. Mais si vous pensez que vous avez besoin pour remplacer l'un, alors vous avez besoin de remplacer tous les deux. Nous allons analyser ce qui devrait arriver si nous remplacer l'un mais pas l'autre et nous essayons d'utiliser un Map
.
Disons que nous avons une classe de ce genre et que les deux objets d' MyClass
sont égales si leurs importantField
est égal (avec hashCode
et equals
généré par eclipse)
public class MyClass {
private final String importantField;
private final String anotherField;
public MyClass(final String equalField, final String anotherField) {
this.importantField = equalField;
this.anotherField = anotherField;
}
public String getEqualField() {
return importantField;
}
public String getAnotherField() {
return anotherField;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((importantField == null) ? 0 : importantField.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final MyClass other = (MyClass) obj;
if (importantField == null) {
if (other.importantField != null)
return false;
} else if (!importantField.equals(other.importantField))
return false;
return true;
}
}
Remplacer uniquement hashCode
Imaginez que vous avez ce
MyClass first = new MyClass("a","first");
MyClass second = new MyClass("a","second");
Si vous n'ignorer hashCode
puis quand vous appelez myMap.put(first,someValue)
il prend tout d'abord, calcule ses hashCode
et les stocke dans un seau. Ensuite, lorsque vous appelez myMap.put(second,someOtherValue)
il devrait remplacer la première avec la seconde que par la Carte de la Documentation parce qu'ils sont égaux (selon notre définition).
Mais le problème est que est égal n'a pas été redéfini, de sorte que lorsque la carte hachages second
et parcourt le seau en regardant si il y a un objet k
tels que second.equals(k)
est vrai qu'elle ne trouverez pas en tant que second.equals(first)
sera false
.
Remplacer uniquement equals
Si seulement equals
est surchargé, puis quand vous appelez myMap.put(first,someValue)
premier sera de hachage pour seau et lorsque vous appelez myMap.put(second,someOtherValue)
il va de hachage à un autre seau (car ils ont un autre hashCode
). Donc, même s'ils sont égaux, car ils ne font pas de hachage pour le même seau, la carte ne peut pas la réaliser et à la fois de leur séjour à la carte.
Espère que c'était clair