Méthode equals() et les hashSet
Bonjour,
Je suis autodidacte en Java et bien que j'ai résolu mon problème à l'aide de la rubrique suivante : http://java.developpez.com/faq/java/...#DIVERS_equals, je n'ai toujours pas compris pourquoi mon ancien code ne fonctionnait pas.
Je dispose d'une classe Tag possédant entre autre un champ String Name (c'est le seul important ici). Je souhaite pouvoir utiliser les ensembles hashSet<Tag> pour la rapidité des méthodes add, remove, et contains, et surtout pour l'élimination automatique des doublons.
J'ai donc redéfinit les méthodes hashCode et equals comme celà :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public class Tag
{
private String name;
private SomeType lotsOfOtherStuff;
public Tag(String name) //constructeur
{
this.name = name;
this.lotsOfOtherStuff = WhatItNeedToBe;
}
public getName()
{return this.name;}
public hashCode()
{return this.name.hashCode();}
public equals(Tag t)
{
return this.name.equals(t.getName());
}
} |
Et voici mon main dans lequelle je réalise mes tests :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class TestProto
{
public static void main(String[] args)
{
// test des hashSet<Tag> :
System.out.println("Etape de test n°0 : teste des HashSet de Tags :");
HashSet<Tag> listeTag = new HashSet<Tag>();
Tag T1 = new Tag("test");
Tag T2 = new Tag("test");
System.out.println("T1.equals(T2) ? : " + T1.equals(T2) + " =?= VRAI");
System.out.println("T1.hashCode() == T2.hashCode() ? :" + (T1.hashCode() == T2.hashCode()) + " =?= VRAI");
listeTag.add(T1);
System.out.println("listeTag.add(T2) ? : " + listeTag.add(T2) + " =?= FAUX"); |
Voici ce que j'obtiens lors de l'éxécution :
Code:
1 2 3 4 5
|
Etape de test n°0 : teste des HashSet de Tags :
T1 == T2 ? : true =?= VRAI <-- la méthode equals renvoie le bon résultat
T1.hashCode() == T2.hashCode() ? :true =?= VRAI <-- la méthode hashCode fonctionne comme prévu
listeTag.add(T2) ? : true =?= FAUX <-- pourtant T2 est quand même rajouter à mon hashSet... |
La correction de la méthode equals à l'aide du lien plus haut résoud mon problème, mais çà ne me dit pas pourquoi avant çà ne marchait pas. Auriez-vous des explications svp ?
Voici à titre indicatif ma nouvelle méthode equals :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public boolean equals(Object T)
{ // Vérificationde la référence
if (T==this)
return true;
//Vérification du type du paramètre puis de ses attributs.
if (T instanceof Tag)
{
Tag Tbis = (Tag) T;
return this.name.equals(Tbis.getName());
} else
return false;
} |