2012-09-04 5 views
5

ho due set:assertEquals java imposta

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 

di uguale modalità di attributo viene sostituito, secondo le mie esigenze:

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()); 
} 

} 

quando il debug, il metodo equals è nemmeno chiamato!

Qualche idea?

+1

Vedi anche: [Override è uguale e hashCode in Java] (http://stackoverflow.com/questions/27581) – McDowell

+0

@McDowell: grazie! Sapevo che se hashCode restituisce valori diversi per 2 oggetti, allora non c'è possibilità di ottenere un vero dalla chiamata uguale. Ero di fretta! :) – Razvan

risposta

13

Non si sta eseguendo l'override di hashCode(), il che significa che verrà utilizzata l'implementazione predefinita. HashSet verifica la corrispondenza dei codici hash prima, prima di chiamare equals - è così che riesce a trovare potenziali corrispondenze in modo efficiente. (È semplice "seccare" un numero intero.)

In pratica, è necessario eseguire l'override di hashCode in modo coerente con il metodo equals.

+0

Ciò significa che se 'equals' restituisce true,' hashCode' deve restituire true (solo in questa direzione). – brimborium

0

Se si controlla il codice sorgente di HashSet chiamate di metodo containsKey() che chiama getEntry(). Come per il codice sorgente sottostante, è chiaro che è necessaria un'implementazione hashcode() corretta per chiamare equals.

/** 
* 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: Contains() il metodo utilizzato da eguali di AbstractCollection