2013-03-21 8 views
5

Die Methode equals vergleicht, ob zwei Objektwerte gleich sind oder nicht. Meine Frage ist, wie es die beiden Objekte vergleicht? Wie kann es sagen, dass die beiden Objekte gleich sind oder nicht? Ich möchte wissen, was es vergleicht die beiden Objekte. Ich schließe die Methode hashCode nicht ein.Wie funktioniert die Methode equals() in Java?

+0

Wenn Sie Objekte vergleichen müssen, würde ich Ihnen empfehlen, einen Blick auf Guave Bibliothek Objekt Helper zu werfen: https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained – evgenyl

Antwort

6

Die Standardimplementierung, die eine der Klasse java.lang.Object testet einfach die Verweise auf das gleiche Objekt sind:

150 public boolean equals(Object obj) { 
151  return (this == obj); 
152 } 

Der Referenzgleichheitsoperator, wie dies in den Java Specification beschrieben:

Zur Laufzeit ist das Ergebnis von == wahr, wenn die Operandenwerte null sind oder beide auf dasselbe Objekt oder Array verweisen; Andernfalls ist das Ergebnis falsch.

Dieses Standardverhalten ist normalerweise nicht semantisch zufriedenstellend. Zum Beispiel können Sie nicht Gleichheit der großen Integer-Instanzen testen == mit:

Integer a = new Integer(1000); 
Integer b = new Integer(1000); 
System.out.println(a==b); // prints false 

Deshalb ist die Methode überschrieben wird:

722  public boolean equals(Object obj) { 
723   if (obj instanceof Integer) { 
724    return value == ((Integer)obj).intValue(); 
725   } 
726   return false; 
727  } 

, die dies ermöglicht:

System.out.println(a.equals(b)); // prints true 

Klassen überschreiben die Standardverhalten sollte auf semantische Gleichheit prüfen, basierend auf der Gleichheit der identifizierenden Felder (normalerweise alle von ihnen). Wie Sie anscheinend wissen, sollten Sie die Methode hashCode entsprechend überschreiben.

0

logisch, equals vergleicht Objekte nicht (aber Sie können alles damit machen), vergleicht sie Werte. für den Objektvergleich ist es ‚==‘ Operator

+1

Ich stimme nicht zu . Equals vergleicht Objekte so, wie sie erstellt wurden. Wie Dystroy erklärt - in der Regel vergleicht es Werte, aber nicht immer, und nicht immer alle von ihnen. Z.B. Bei Entities-Equal-Methoden wird normalerweise nur das ID-Feld verglichen. – robson

+0

Ich erwähnte "logisch" & "Sie können alles tun". 'equals' soll Objekte sinnvoll 'vergleichen' sonst hätten Sie '==' für Objekte. – Ankit

4

Betrachten Beispiel folgendes,

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); 
    } 
} 

Im Code auf Kommentar // 1 es equals Methode von Object-Klasse geerbt Anrufe, die einfach ist, Referenzen von e1 und e2 Vergleich . Es wird also immer false für jedes Objekt geben, das mit dem Schlüsselwort new erstellt wurde.

Nach der Methode Auszug aus Object

public boolean equals(Object obj) { 
    return (this == obj); 
} 

Für Gleichheit JLS Vergleich überprüft equals Methode in unserer Klasse außer Kraft zu setzen gegeben hat. Es ist keine endgültige Methode. JLS weiß nicht, auf welcher Grundlage programmar zwei Objekte gleich machen will. Also gaben sie eine nicht endgültige Methode zum Überschreiben.
hashcode spielt keine Rolle, um die Gleichheit des Objekts zu überprüfen. hashcode prüft/findet den Bucket, wo das Objekt verfügbar ist. wir verwenden hashcode Technik in Hashing, die von einigen Klassen wie HashMap verwendet wird ..

Wenn zwei Objekt hashcode Gleichen sind, die nicht der Fall ist, bedeutet zwei Objekte gleich sind.
Bei zwei Objekten, wenn die Methode equals wahr zurückgibt, muss der Hashcode identisch sein.

Sie haben equals Methode außer Kraft zu setzen, zu entscheiden, welcher Basis Sie das Objekt wollen e1 und e2 in obigem Code gleich ist. Geht es um passportNumber oder socialSecurityNumber oder die Kombination passportNumber+socialSecurityNumber?

I want to know based on what it compares the two objects. 

Antwort ist standardmäßig mit Hilfe von vererbten Objectequals Methode der Klasse es zwei Referenz Gleichheit des Objekts unter Verwendung == Symbol vergleicht. Der Code ist oben angegeben.