Il metodo equals
confronta se due valori oggetto sono uguali o meno. La mia domanda è come confronta i due oggetti? Come può dire che i due oggetti sono uguali o no? Voglio sapere in base a cosa confronta i due oggetti. Non sto includendo il metodo hashCode
.Come funziona il metodo equals() in Java
risposta
L'implementazione predefinita, quella della classe java.lang.Object
, test semplicemente i riferimenti sono allo stesso oggetto:
150 public boolean equals(Object obj) {
151 return (this == obj);
152 }
L'operatore di uguaglianza di riferimento è descritto come tale nel Java Specification:
In fase di esecuzione, il risultato di == è true se i valori dell'operando sono entrambi null o entrambi si riferiscono allo stesso oggetto o array; in caso contrario, il risultato è falso.
Questo comportamento predefinito non è solitamente soddisfacente semanticamente. Per esempio, non è possibile verificare l'uguaglianza di istanze grandi interi utilizzando ==
:
Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false
Ecco perché il metodo viene sovrascritto:
722 public boolean equals(Object obj) {
723 if (obj instanceof Integer) {
724 return value == ((Integer)obj).intValue();
725 }
726 return false;
727 }
che permette questo:
System.out.println(a.equals(b)); // prints true
Classi imperativi della il comportamento predefinito dovrebbe verificare l'uguaglianza semantica, basata sull'uguaglianza dei campi di identificazione (solitamente tutti).
Come sembra sapere, è necessario ignorare il metodo hashCode
di conseguenza.
logicamente, equivale a non confrontare gli oggetti (ma è possibile fare qualsiasi cosa con esso), confronta i valori. per il confronto oggetto c'è operatore '=='
Non sono d'accordo . Uguale confronta gli oggetti nel modo in cui è stato creato. Come spiegato dalla distroy, di solito confronta i valori, ma non sempre, e non sempre tutti. Per esempio. per le entità uguali il metodo di solito confronta solo il campo id. – robson
ho menzionato, "logicamente" e "puoi fare qualsiasi cosa". 'equals' suppone di confrontare gli oggetti 'significativamente' altrimenti potreste non avere '==' per gli oggetti. – Ankit
Consideriamo seguente esempio,
public class Employee {
String name;
String passportNumber;
String socialSecurityNumber;
public static void main(String[] args) {
Employee e1 = new Employee();
Employee e2 = new Employee();
boolean isEqual = e1.equals(e2); // 1
System.out.println(isEqual);
}
}
Nel codice a commento // 1 Chiede ereditato equals
metodo dalla classe Object che è semplicemente confrontando i riferimenti di e1
e e2
. Quindi assegnerà sempre false
per ogni oggetto creato utilizzando la parola chiave new
.
seguito è il metodo estratto da Object
public boolean equals(Object obj) {
return (this == obj);
}
per il confronto di uguaglianza controllare JLS ha dato equals
metodo per ignorare nella nostra classe. Non è un metodo definitivo. JLS non sa su quale base il programmar vuole rendere uguali due oggetti. Quindi hanno dato il metodo non definitivo per scavalcare.
hashcode
non svolge alcun ruolo per controllare l'uguaglianza dell'oggetto. hashcode
controlla/trova il bucket in cui è disponibile l'oggetto. usiamo hashcode
in tecnica che viene utilizzata da alcune classi come HashMap hashing ..
Se hashcode due dell'oggetto sono uguali, che non significa che due oggetti sono uguali.
Per due oggetti, se il metodo equals
restituisce true, allora hashcode deve essere uguale.
Si dovrà eseguire l'override equals
metodo per decidere su quali basi si vuole obiettare e1
e e2
nel codice di cui sopra è uguale. È sulla base di passportNumber
o socialSecurityNumber
o della combinazione di passportNumber+socialSecurityNumber
?
I want to know based on what it compares the two objects.
risposta è, di default con l'aiuto del metodo di equals
ereditato Object
di classe si confronta l'uguaglianza di riferimento di due dell'oggetto utilizzando == simbolo. Il codice è indicato sopra.
Se è necessario confrontare gli oggetti, ti consiglio di dare un'occhiata all'helper di oggetti libreria guava: https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained – evgenyl