2012-10-30 13 views
12

Eventuali duplicati:
Overriding equals and hashCode in JavaQuando è necessario sovrascrivere i metodi equals e hashcode?

Se ho

class A { 
    int x = 1; 
} 
... 
A a1 = new A(); 
A a2 = new A(); 
a1.equals(a2); 

Se confronto 2 istanze di A senza eseguire l'override del metodo equals, Riceverò risultato atteso?

+0

Questo è legato, ma non un duplicato di http: // StackOverflow .com/questions/27581/overriding-equals-and-hashcode-in-java perché si tratta di * come * per sovrascrivere 'equals' e' hasCode', mentre si tratta di * quando * per sovrascrivere. – Raedwald

+0

Questo sembra essere un duplicato migliore: http://stackoverflow.com/questions/13387742 –

risposta

28

Se si confrontano 2 istanze di A senza eseguire l'override del metodo equals, otterrò il risultato previsto?

Questo dipende da ciò che ci si aspetta :)

L'implementazione di default vi darà uguaglianza di riferimento - in altre parole, quando si confrontano due riferimenti, equals sarà solo restituire true se sono i riferimenti a lo stesso oggetto.

Si dovrebbe sovrascrivere lo equals per implementare "valore di uguaglianza" - dove due oggetti distinti sono considerati uguali, di solito in virtù di avere stessi valori di campo stessi. Il significato esatto dell'uguaglianza dipenderà dal tuo design - i due oggetti potrebbero essere ancora distinguibili in altri modi, per esempio.

Se si ignora equals, si dovrebbe anche esclusione hashCode essere coerenti con equals, tale che se a.equals(b) è vero, allora a.hashCode() == b.hashCode(). Ciò consentirà alle istanze della classe di essere utilizzate come chiavi in ​​raccolte basate su hash (ad esempio HashMap) in modo da poter cercare un valore basato su una chiave che è uguale a uguale a quella originale, piuttosto che dover utilizzare un riferimento all'esatto oggetto chiave originale.

+8

quindi vuol dire che se non sovrascrivo il metodo equals, equals() equivale a ==? – user926958

+8

@ user926958: Sì, esattamente. –

2

L'implementazione predefinita di equals verifica se le variabili fanno riferimento allo stesso oggetto. Se questo non è quello che vuoi, allora devi sostituire lo equals. Quando si esegue l'override di equals, è generalmente necessario eseguire l'override di hashcode affinché l'oggetto sia utilizzabile in tabelle hash (o altre strutture di dati che utilizzano codici hash).

3

Se si confrontano 2 istanze di A senza eseguire l'override del metodo equals, verrà ottenuto il risultato ?

No. Dato che sono state create due istanze diverse in modo esplicito.

Perché? L'implementazione predefinita di uguale verifica se le due voci in questione puntano alla stessa locazione di memoria in Java memoria virtuale (e questo comportamento predefinito è definito in java.lang.Object.equals())

Quando devo sovrascrivere i metodi equals e hashcode?

Lo scenario più comune quando i programmatori hanno la precedenza entrambe le equals() e hashCode() sono, se è necessario utilizzare le istanze della classe in questione come

  1. chiavi nelle implementazioni java.util.Map
  2. Valori nelle implementazioni java.util.Set
  3. Si desidera controllare l'uguaglianza di valori tra due diverse istanze della stessa classe (l'override di equals() è obbligatorio in questo caso, hashcode() non lo è - ma è una buona pratica di programmazione per)

contratto generale di eguali e codice hash è:

if a1.equals(a2) 
    it is mandatory that a1.hashcode() == a2.hashcode() 
if a1.hashcode() == a2.hashcode() 
    it is not mandatory that a1.equals(a2) 

Credo che dati sufficienti per elaborare per un giorno :)

Problemi correlati