Java: les objets dupliqués sont ajoutés à définir?
Si j'exécute le code ci-dessous, alors la sortie est de 2, ce qui signifie que le set contient 2 éléments. Cependant je pense que ce set contient 1 depuis deux objets sont égaux basé sur hashcode() valeur ainsi que .equals()
méthode.
Semble évident erreur dans ma compréhension ?
package HELLO;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
public int hashcode() {
return a;
}
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
public String toString() {
return "Alpha : " + a;
}
}
source d'informationauteur snow_leopard
Vous devez vous connecter pour publier un commentaire.
Votre hashcode méthode ne remplace pas l'Objet de la classe hashCode méthode et donc votre méthode equals ruptures de contrat, car il n'est pas d'accord avec le hashCode résultats, et vous pouvez avoir des objets qui sont "égaux", mais ont différents hashCodes.
N'oubliez pas: Vous devez toujours utiliser le
@Override
annotation lors de la redéfinition des méthodes, comme ce sera vous aider à attraper ce et erreurs similaires.Aussi, vous voulez améliorer votre mise en forme du code, en particulier lors de l'affichage de code ici pour notre examen. Nous serons en mesure de mieux comprendre votre code et vous aider si elle est conforme à des normes (c'est pourquoi il existe des normes). Donc, essayez de garder votre indentations compatible avec toutes les lignes de code qui sont dans le même bloc en retrait au même niveau, et vous voulez être sûr que la base de code de niveau, y compris les importations, à l'extérieur de la classe de déclarations et de sa fin accolade, est aligné à gauche:
Pour une belle critique sur ce, veuillez lire: Primordial equals et hashCode en Java
votre méthode hashcode devrait être nommé hashCode (capitale de la lettre "C").
Si vous prévoyez sur le remplacement des méthodes que vous devez utiliser le
@Override
annotation.Si l'on avait utilisé cette annotation, vous auriez remarqué le problème plus tôt que le code n'aurait pas compilé.
L' @Remplace l'annotation consiste à substituer la méthode avec le même nom dans la super-classe".