2016-03-23 10 views
-2

Wie wir wissen == Vergleiche Referenzen und equals() vergleichen Sie den Inhalt. Aber nach der Überprüfung equals() Implementierung in Object class wurde ich verwirrt. Die Implementierung istHow equals() anders als == in Java

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

wie Sie die Implementierung sehen. equals intern ruft == Betreiber. Wie anders?

+1

Überprüfen Sie nun den Quellcode einer anderen equals() - Implementierung. Say: die in Integer – Gimby

+2

Sie sind die gleichen für die Standard-'equals'-Implementierung von' Object'. Nicht für 'String' oder andere Klassen, die die Methode überschreiben. – Berger

+1

Wenn Sie die Gleichheit vergleichen wollen, definieren Sie Ihre eigene Logik (wie sollte Java wissen, was zwei Objekte logisch gleich macht?). Dort überschreiben Sie 'equals' und definieren Ihre Logik, während der Standard' Object # equals' keinen logischen Vergleich haben kann, obwohl verglichen wird, ob beide Objekte auf dieselbe Instanz verweisen. – SomeJavaGuy

Antwort

5

Sie unterscheiden sich einfach darin, dass Sie equals() überschreiben können, aber == in keiner Weise überschreiben können.

Während also equals() für logische Gleichheit zweier Objekte überprüfen kann, ob die Klasse Autor so entscheidet, == wird die Referenz immer vergleichen und somit nur wahr, wenn beide Operanden das gleiche Objekt (oder gleiche Grundwert) sind.

+0

Ich weiß nicht, warum ich -1 in meiner Frage bekam, zuerst war das 4. Aber Sie liefern wirklich den genauen Unterschied .. !! Vielen Dank. – UnKnown

+0

Sie haben gewählt, weil diese Frage vorher gefragt wird. – martijnn2008

+0

Möglicherweise weil eine schnelle Suche auf dieser Site Ihnen die Antwort geben würde, ohne eine neue Frage bekannt geben zu müssen. –

0

Die equals() -Methode vergleicht den "Wert" in String-Instanzen (auf dem Heap) unabhängig davon, ob die beiden Objektreferenzen auf dieselbe String-Instanz verweisen oder nicht. Wenn sich zwei Objektreferenzen vom Typ String auf dieselbe String-Instanz beziehen, dann ist das großartig! Wenn sich die beiden Objektreferenzen auf zwei verschiedene String-Instanzen beziehen, macht das keinen Unterschied. Es ist der "Wert" (dh der Inhalt des Zeichenarrays) innerhalb jeder String-Instanz, die verglichen wird.

Auf der anderen Seite vergleicht der Operator "==" den Wert von zwei Objektreferenzen, um zu sehen, ob sie sich auf dieselbe String-Instanz beziehen. Wenn der Wert der beiden Objektreferenzen auf dieselbe String-Instanz verweist, wäre das Ergebnis des booleschen Ausdrucks "true" .. duh. Wenn andererseits der Wert beider Objektreferenzen "auf verschiedene String-Instanzen verweist" (obwohl beide String-Instanzen identische "Werte" haben, ist der Inhalt der Zeichen-Arrays jeder String-Instanz identisch) Ergebnis des booleschen Ausdrucks wäre "false".