Bonjour,
J'utilise la classe HashSet pour stocker des objets de ma Classe Rapport.
La classe HashSet est censée avoir la particularité de ne pas pouvoir contenir 2 fois le même élément.
cette décision est basée sur le code suivant: extrait de la classe HashSet
Pourtant voici ce qui m'arrive, après avoir modifié la fonction HashCode de Rapport pour qu'elle se base sur les attributs et renvoie donc la même chose pour deux instances ayant les mêmes attributs.// Extrait de la classe HashMap
public Object put(Object key, Object value) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
for (Entry e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
Object oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, k, value, i);
return null;
}
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static boolean eq(Object x, Object y) {
return x == y || x.equals(y);
}
Ainsi mes 2élements étaient identiques, mais le 2 ème à tout de même été ajouté au HashSet s.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Je crée deux instances de Rapport avec les mêmes attributs. Rapport r1 = new Rapport(...); Rapport r2 = new Rapport(...); HashSet s=new HashSet(); System.out.println(r1.hashCode()==r2.hashCode()); //retourne true System.out.println(r1.equals(r2)); //retourne true System.out.println(r2.equals(r1)); //retourne true System.out.println(s.add(r1)); //retourne true System.out.println(s.add(r2)); //retourne true System.out.println(s.size()); //retourne 2
J'aimerai comprendre pourquoi, est-ce à cause de la partie de code que j'ai mise en bleu ? N'ai-je pas compris le fonctionnement de la méthode ?
Question subsidiaire, pourquoi ne peut-on pas faire un HashSet de HashSet ?
Merci beaucoup,
William Ledoux
Partager