2013-03-21 11 views
5

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

+0

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

risposta

6

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.

0

logicamente, equivale a non confrontare gli oggetti (ma è possibile fare qualsiasi cosa con esso), confronta i valori. per il confronto oggetto c'è operatore '=='

+1

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

+0

ho menzionato, "logicamente" e "puoi fare qualsiasi cosa". 'equals' suppone di confrontare gli oggetti 'significativamente' altrimenti potreste non avere '==' per gli oggetti. – Ankit

4

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.