2012-09-04 3 views
5

J'ai deux ensembles:java assertEquals définit

Set<Attribute> set1 = new HashSet<Attribute>(5); 
Set<Attribute> set2 = new HashSet<Attribute>(5); 

//add 5 attribute objects to each of them. (not necessarily the same objects) 


assertEquals(set1,set2); //<--- returns false, even though 
         //the added attribute objects are equal 

La méthode equals de l'attribut est surchargée, selon mes exigences:

public abstract class Attribute implements Serializable{ 

public int attribute; 

public abstract boolean isNumerical(); 

@Override 
public boolean equals(Object other){ 
    if(!(other instanceof Attribute)){ 
     return false; 
    } 

    Attribute otherAttribute = (Attribute)other; 
    return (this.attribute == otherAttribute.attribute && 
      this.isNumerical() == otherAttribute.isNumerical()); 
} 

} 

lorsque le débogage, la méthode equals est même pas appelé!

Des idées?

+1

Voir aussi: [Primauté est égal et hashCode en Java] (http://stackoverflow.com/questions/27581) – McDowell

+0

@McDowell: merci! Je savais que si hashCode renvoyait des valeurs différentes pour 2 objets, il n'y a aucune chance d'obtenir un vrai de l'appel égal. J'étais pressé! :) – Razvan

Répondre

13

Vous ne remplacez pas hashCode(), ce qui signifie que l'implémentation par défaut sera utilisée. HashSet vérifie les codes de hachage correspondants d'abord, avant d'appeler equals - c'est ainsi qu'il parvient à trouver des correspondances potentielles si efficacement. (Il est facile de "seau" un nombre entier.)

Fondamentalement, vous devez remplacer hashCode d'une manière qui est cohérente avec votre méthode equals.

+0

Ce qui signifie que si 'equals' retourne vrai,' hashCode' doit retourner vrai aussi (seulement dans ce sens). – brimborium

0

Si vous vérifiez le code source de HashSet la méthode appelle containsKey() qui appelle getEntry(). Selon le code source ci-dessous, il est clair qu'une implémentation correcte de hashcode() est nécessaire pour appeler des égales.

/** 
* Returns the entry associated with the specified key in the 
* HashMap. Returns null if the HashMap contains no mapping 
* for the key. 
*/ 
final Entry<K,V> getEntry(Object key) { 
    int hash = (key == null) ? 0 : hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && 
      ((k = e.key) == key || (key != null && key.equals(k)))) 
      return e; 
    } 
    return null; 
} 

PS: méthode Contains() est utilisé à partir de égaux AbstractCollection

Questions connexes