2016-04-06 9 views
2

Vor ein paar Tagen zeigte mir mein Professor, wie man die equals-Methode und viele mehr implementiert.Ich verstehe diese Implementierung der equals-Methode nicht

Dies ist Codebeispiel aus seiner Methode equals und ich nicht einen Teil verstehen:

public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Knjiga other = (Knjiga) obj; 
    return Objects.equals(isbn,other.isbn); 
} 

In ersten if-Anweisung er prüfen, ob dieses (aktuelles Objekt) mit dem Objekt obj die gleiche Referenz hat (das ist, was == Operator tut? Vergleichen Sie nur zwei Referenzen)

Und wenn sie die gleiche Referenz bekommen, wird es wahr? Aber wir werden niemals andere Felder prüfen, wie zB isbn und viele mehr, die wir setzen könnten, weil die Methode nie zum Teil kommen wird, wenn diese beiden Objekte die gleiche Referenz haben.

Meiner Ansicht nach ist diese Methode ähnlich doppelt Operator cuz eines dieser beiden nicht zu prüfen Felder, nur Referenz?

+0

Wenn die beiden Referenzen die gleichen sind, dann ist es ein Objekt, nicht zwei. – zeroflagL

+0

Ihr Professor verwendet keine Klammern für seine if-Anweisungen? Beeindruckend. Außerdem: Objects.equals überprüft bereits die Referenzen und Nullwerte. –

Antwort

8

Wenn die beiden Objekte, die verglichen werden, dieselbe Referenz haben, ist dies das gleiche Objekt, und es hat keinen Sinn, etwas anderes zu vergleichen. Sie können sofort true zurückgeben und einige Vergleiche speichern.

Die anderen Eigenschaften sind in diesem Fall garantiert gleich.

+0

Hmm, aber wenn ich schreiben gleich ist, machen wir um zu überprüfen, ob alle Felder gleich sind? Und das wird nur Referenz überprüfen? –

+1

@MiljanRakita es überprüft nur die Referenz nur, wenn die Referenzen gleich sind. Ansonsten läuft es mit dem Rest der Überprüfungen ab. – Eran

+0

Also, wenn die Referenzen gleich sind, wird diese Methode wahr zurückgeben? Es ist das gleiche wie wir nur einigeOb == otherOb anstelle der Verwendung dieser equals-Methode verwendet someOb.equals (otherOb) Weil sie beide jetzt nur Referenzen überprüfen? –

1

Wenn (this == obj) wahr ist, ist es das gleiche Objekt, also ist es offensichtlich gleich.

Wenn diese beiden if-Klauseln sind nicht wahr

if (obj == null) 
    return false; 
if (getClass() != obj.getClass()) 
    return false; 

es bedeutet, dass die beiden Objekte sowohl aus der gleichen Klasse sind, aber nicht das gleiche Objekt so dann mit

Knjiga other = (Knjiga) obj; 
return Objects.equals(isbn,other.isbn); 

geprüft, ob die isbn der beiden Objekte sind gleich, wenn also die beiden Knjiga Objekte auch gleich sind.

+0

Es ist jetzt klar, danke! –

1

Betrachten Sie den folgenden Code ein:

String s1 = new String("Test"); 
    String s2 = new String("Test"); 
    String s3 = s2; 
    String s4 = "Test"; 
    String s5 = "Test"; 
    System.out.println(s1 == s2); //Prints false 
    System.out.println(s2 == s3); //Prints true 
    System.out.println(s3 == s4); //Prints false 
    System.out.println(s4 == s5); //Prints true 

s1 und s2 sind neue Instanzen eines String-Objekt. Nur weil sie den gleichen scheinbaren Wert "Test" haben, haben sie nicht notwendigerweise den gleichen Wert für Ihr Programm. Infolgedessen sind diese beiden hinsichtlich ihrer Objekte nicht gleich.

s3 ist eine exakte Kopie von s2, was bedeutet, dass es sich um ein exaktes Duplikat der String-Instanz s2 handelt. Dies bedeutet wiederum, dass sie in ihrer Instanz objektiv gleich sind.

s4 ist ein String, der direkt "Test" zugewiesen ist und nicht unbedingt eine neue Instanz eines String-Objekts ist. Sie sind daher objektiv nicht gleich. (Siehe String Interning)

s5 ist auch direkt "Test" zugewiesen, daher entspricht es s4. Weitere Informationen dazu, warum dies funktioniert, finden Sie unter String-Internierung.

Dies ist eine weniger komplizierte Art, Ihre Situation zu beschreiben, sollte aber eine gute Erklärung zu den Grundlagen des Objektvergleichs geben.

1

Logik der equals Methode des Codes:

  1. First condition: Es ist offensichtlich. Wenn Bezug beider Objekte gleich sind, return true

    if (this == obj) 
        return true; 
    
  2. Second condition: Wenn ein anderes Objekt NULL ist, return false

    if (obj == null) 
        return false; 
    
  3. Third condition: nun sowohl aktuelle Objekt und andere Objekte sind nicht null. Überprüfen Sie, ob Klassenname für beide Objekte gleich ist. Wenn die Klasse anders ist, gebe false zurück.

    if (getClass() != obj.getClass()) 
        return false; 
    
  4. Fourth condition: Jetzt sind beide Objekte nicht null und derselben Klasse angehören. Überprüfen Sie, ob die Attribute [isbn in diesem Beispiel] dieser Objekte gleich sind oder nicht. Wenn sie nicht gleich sind, gebe false zurück.

    Knjiga other = (Knjiga) obj; 
    return Objects.equals(isbn,other.isbn); 
    
1

Objekte verweisen == verwendet werden miteinander verglichen. Wenn Sie die equals-Methode in Ihrer Klasse überschreiben, um zwei Objekte Ihrer Klasse zu vergleichen, ist es sinnvoll, zuerst die Referenz equal zu verwenden. Dies spart den Vergleich aller Attribute innerhalb des Objekts. Betrachten Sie das Beispiel Cat Klasse

public class Cat { 
String country; 
int numberOfCats; 
public Cat(String country, int numberOfCats) { 
    this.country = country; 
    this.numberOfCats = numberOfCats; 
} 
public boolean equals(Object obj) { 
    if(this == obj) 
     return true; 
    if(obj == null) 
     return false; 
    Cat eqlObj = (Cat) obj; 
    if(this.country.equals(eqlObj.country) && this.numberOfCats == eqlObj.numberOfCats) 
     return true;  
    return false; 
} 
} 

Prüfklasse

public class TestCat { 
public static void main(String args[]) { 
    Cat obj1 = new Cat("France", 9600); 
    Cat obj2 = obj1; 
    obj1.equals(obj2); 
} 
} 

In der obigen Testklasse sowohl obj1 und obj2 auf die gleiche Cat-Objekt. Das Vergleichen der Referenz wird "wahr" zurückgeben, d. H. Wenn der Block gleich ist.

Ein weiterer Test

public class TestCat { 
public static void main(String args[]) { 
    Cat obj1 = new Cat("France", 9600); 
    Cat obj2 = new Cat("France", 9600); 
    obj1.equals(obj2); 
} 
} 

In diesem Testklasse neue Objekt wird für obj1 und obj2 so die Referenz sie anders sein wird halten erstellt. Der Wert im Objekt ist gleich. Erstens, wenn der Block in den Equals fehlschlägt, da die Referenz unterschiedlich ist. Drittens, wenn Block in den Gleichen die Werte vergleicht und "wahr" zurückgibt.

Hoffe, dies hilft ..

+0

Danke, es hilft sehr! –