Perché dobbiamo sostituire il metodo equals () in Java?

Ho una certa confusione sul motivo per cui .equals metodo .equals .

Per esempio:

 Test test1 = new Test(3); Test test2 = new Test(3); //The if comparison does the same thing that the overridden `.equals()` method does. if(test1.equals(test2)){ System.out.println("test1 and test2 are true in .equals()"); } // 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() .

Dall’articolo Override equals and hashCode in Java :

L’implementazione predefinita della class equals () fornita da java.lang.Object confronta la posizione della memoria e restituisce true solo se due variabili di riferimento puntano alla stessa posizione di memoria, ovvero essenzialmente sono lo stesso object.

Java consiglia di sovrascrivere equals e metodo hashCode se l’uguaglianza deve essere definita in modo logico o tramite una logica di business : esempio:

molte classi nella libreria standard di Java lo sovrascrivono, ad es. String sovrascrive equals, la cui implementazione del metodo equals () restituisce true se il contenuto di due oggetti String è esattamente lo stesso

La class di wrapper intero sovrascrive equivale a eseguire il confronto numerico, ecc.

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 class Object utilizza l’operatore di identity framework ( == ) 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 i riferimenti object sono uguali, ovvero se gli oggetti confrontati sono esattamente lo stesso object.

Per verificare se due oggetti sono uguali nel senso di equivalenza (contenente la stessa informazione), è necessario sovrascrivere il metodo equals() .

(Preventivo parziale – click through per leggere esempi.)

.equals () non esegue un confronto intelligente per la maggior parte delle classi a meno che la class non lo sovrascriva. Se non è definito per una class (utente), si comporta come ==.

Riferimento: http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

Il comportamento predefinito per java.lang.Object è di confrontare i riferimenti, ma non è appropriato per ogni tipo di object. Ci sono cose chiamate oggetti valore (come BigDecimal o String), in cui 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’object assume.

Per rispondere alla tua domanda, in primo luogo, ti consiglio vivamente di consultare la documentazione .

Senza sovrascrivere il metodo equals (), si comporterà come “==”. Quando si utilizza l’operatore “==” sugli oggetti, si controlla semplicemente per vedere se quei puntatori si riferiscono allo stesso object. Non se i loro membri contengono lo stesso valore.

Eseguiamo l’override per mantenere pulito il nostro codice e astrarre la logica di confronto dall’istruzione If, ​​nell’object. Questo è considerato una buona pratica e sfrutta l’approccio fortemente orientato agli oggetti di Java.

Lasciatemi fare un esempio che trovo molto utile.

Puoi 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 ti darà 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 tuo metodo di equità e specificare cosa vuoi veramente confrontare.

Per impostazione predefinita .equals () utilizza la funzione di id quadro == per confrontare, che ovviamente non funziona in quanto le istanze test1 e test2 non sono le stesse. == funziona solo con tipi di dati primitivi come int o string. Quindi è necessario sovrascriverlo per farlo funzionare confrontando tutte le variabili membro della class Test

Il metodo Object.equals () controlla solo il riferimento del tipo di dati non primitivo o il valore dell’object (object class Wrapper di dati primitivi, tipo di dati primitivi semplici (byte, brevi, int, lunghi ecc.)). In modo che dobbiamo eseguire l’override del metodo equals () quando confrontiamo l’object in base al tipo di dati primitivi.