2013-03-02 13 views
12

Ho una certa confusione sul motivo per cui ignoriamo il metodo .equals.Perché dobbiamo sovrascrivere il metodo equals() in Java?

Ad esempio:

Test test1 = new Test(3); 
Test test2 = new Test(3); 

// The if comparison statement do same thing 
// which the overridden `.equals()` method does. 

if(test1.equals(test2)){ 
    System.out.println("test1 and test2 are ture in .equal"); 
} 

// Override .equals method. 

public boolean equals(Object object) { 
    if(object instanceof Test && ((Test)object).getValue() == this.t) { 
     return true; 
    } else { 
     return false; 
    } 
} 

non capisco perché dobbiamo sovrascrivere il metodo .equals().

+1

'test1.equals (test2)' non funzionerà come previsto se non lo si sovrascrive. –

+6

Nota: è necessario eseguire l'override di 'hashCode()' se si esegue l'override di 'equals()' – exexzian

risposta

19

Questo dovrebbe essere sufficiente per rispondere alla tua domanda: http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

Il metodo equals() confronta due oggetti per l'uguaglianza e restituisce true se sono uguali. Il metodo equals() fornito nella classe Object utilizza l'operatore di identità (==) per determinare se due oggetti sono uguali. Per i tipi di dati primitivi, questo fornisce il risultato corretto. Per gli oggetti, tuttavia, non è così. Il metodo equals() fornito da Object verifica se gli oggetti riferimenti sono uguali, ovvero se gli oggetti confrontati sono esattamente lo stesso oggetto.

Per verificare se due oggetti sono uguali nel senso di equivalenza (contenente le stesse informazioni), è necessario sovrascrivere il metodo equals().

(citazione parziale -. Scegliere attraverso per leggere esempi)

+0

_Il metodo equals() fornito nella classe Object utilizza l'operatore di identità (==) per determinare se due oggetti sono uguali. Per i tipi di dati primitivi, questo fornisce il risultato corretto. Per gli oggetti, tuttavia, non_. Il che significa che è meglio usare '==' se non troviamo la necessità di sovrascrivere il metodo 'equals()'. Ho ragione ? –

2

Per rispondere alla tua domanda, in primo luogo vi consiglio vivamente guardando il Documentation.

Senza sovrascrivere il metodo equals(), si comporta come "==". Quando si utilizza l'operatore "==" sugli oggetti, si controlla semplicemente per vedere se quei puntatori si riferiscono allo stesso oggetto. Non se i loro membri contengono lo stesso valore.

Sostituiamo per mantenere pulito il nostro codice e astratto la logica di confronto dall'istruzione If nell'oggetto. Questo è considerato una buona pratica e sfrutta l'approccio fortemente orientato agli oggetti di Java.

36

Dall'articolo Override equals and hashCode in Java:

implementazione di default di equals() della classe fornito da java.lang.Object confronta posizione di memoria e solo return true se la variabile di riferimento di due stanno indicando stessa posizione di memoria cioè essenzialmente sono lo stesso oggetto.

Java raccomanda di esclusione uguale e hashCode metodo se l'uguaglianza sta essere definite in via logica o attraverso qualche logica di business: Esempio:

molte classi nella libreria standard di Java non ignorarlo per esempio La stringa sovrascrive uguale a, la cui implementazione del metodo equals() restituisce true se il contenuto di due oggetti String è esattamente lo stesso

Sostituzioni di classe wrapper intero uguale a eseguire il confronto numerico, ecc.

3

Il comportamento predefinito per java.lang.Object è di confrontare i riferimenti, ma non è appropriato per ogni tipo di oggetto. Ci sono cose chiamate Value Objects (come BigDecimal o String), dove gli oggetti con lo stesso valore sono considerati intercambiabili, quindi il comportamento predefinito di uguali non è desiderabile. Questi tipi di oggetti devono implementare equals e hashcode in base al valore che l'oggetto assume.

1

Object.equalsQ() metodo verifica solo riferimento dell'oggetto non primitivo tipo di dati o valore Object (classe wrapper oggetto dati primitivi, semplice operazione primitiva (byte, short, int , lungo ecc.)). In modo che dobbiamo eseguire l'override del metodo equals() quando confrontiamo l'oggetto in base al tipo di dati primitivi.

2

Lasciatemi fare un esempio che trovo molto utile.

Si può pensare al riferimento come al numero di pagina di un libro. Supponiamo ora di avere due pagine a e b come sotto.

BookPage a = getSecondPage();

BookPage b = getThirdPage();

In questo caso, a == b verrà visualizzato il valore false. Ma perché? Il motivo è che ciò che == sta facendo è come confrontare il numero di pagina. Quindi, anche se il contenuto di queste due pagine è esattamente lo stesso, si otterrà comunque un falso.

Ma cosa facciamo se vogliamo confrontare il contenuto?

La risposta è scrivere il proprio metodo di equità e specificare ciò che si desidera realmente confrontare.

2

Per impostazione predefinita .equals() utilizza la funzione di identità == per confrontare che ovviamente non funziona poiché le istanze test1 e test2 non sono uguali. == funziona solo con tipi di dati primitivi come int o string. Quindi è necessario sovrascriverlo per farlo funzionare confrontando tutte le variabili membro della classe Test

+0

È consigliabile ignorare il metodo equals ogni volta che una classe viene creata e verrà confrontata. – user1559897