Das Verhalten der equals () Methode in Java [duplicate]

8

Betrachten Sie den folgenden Java-Code:

%Vor%

Die erste Druckanweisung gibt true und die zweite false aus.

Wenn dies ein absichtliches Verhalten ist, wie hilft das bei der Programmierung in Java?

Wenn dies kein absichtliches Verhalten ist, ist das ein Fehler in Java?

    
siva636 14.02.2012, 13:36
quelle

5 Antworten

23

Ich werde Ihre Frage mit Vorbehalten beantworten, aber Sie sollten wissen, dass Sie sich verletzen, wenn die Absicht der Frage war, Sie dazu zu bringen, zu lernen, und Ihre Lösung war, StackOverflow zu fragen. Das beiseite ...

Dieses Verhalten ist beabsichtigt.

Die Standardmethode equals() für java.lang.Object vergleicht Speicheradressen , was bedeutet, dass sich alle Objekte voneinander unterscheiden (nur zwei Referenzen auf dasselbe Objekt geben true ) zurück.

java.lang.Integer überschreibt dies, um den Wert von Integer s zu vergleichen, also zwei verschiedene Integer s, die beide die Nummer zwei im Vergleich gleich darstellen. Wenn Sie stattdessen == verwenden, erhalten Sie in beiden Fällen false .

Die Standardmethode in Java besteht darin, die equals -Methode zu überschreiben, um true für Objekte zurückzugeben, die denselben logischen -Wert haben, selbst wenn sie zu unterschiedlichen Zeiten (oder sogar mit anderen Parametern) erstellt wurden ). Es ist nicht sehr nützlich, Objekte zu haben, die Zahlen darstellen, wenn Sie keine Möglichkeit haben zu fragen: "Haben diese beiden Dinge den gleichen Wert?".

Übrigens, und das ist hier eine Tangente, Java hält tatsächlich einen Cache von Integer -Objekten für kleine Werte. Manchmal erhalten Sie also zwei Integer -Objekte, wo sogar der == -Operator true zurückgibt, obwohl Sie sie aus zwei verschiedenen Quellen beziehen. Sie können sogar Code erhalten, der sich bei größeren Ganzzahlen anders verhält als bei kleineren Ganzzahlen, ohne dass er sich die Integralwerte ansehen muss!

    
Borealid 14.02.2012, 13:39
quelle
6

Dies ist ein beabsichtigtes Verhalten.

Object.equals() berücksichtigt die Objektidentität (d. h. ein Objekt ist nur ihm gleich), was das einzige ist, was Sie für generische Objekte tun können.

Integer überschreibt die Methode, um vom Integer-Wert abhängig zu sein, da zwei Integer-Objekte mit demselben Wert logisch gleich sind. Viele andere Klassen überschreiben auch equals() , da dies ein Kernmechanismus der Standard-API ist und eine große Funktionalität, z. im Rahmen der Sammlungen hängt davon ab.

Warum verwirrst dich das Verhalten überhaupt? Die meisten Leute sind nur verwirrt durch den == Operator nicht verhält sich so (es funktioniert wie Object.equals() ).

    
Michael Borgwardt 14.02.2012 13:39
quelle
2

Die equals -Methode in Java dient einem bestimmten Zweck: Sie bestimmt, ob die Objekte logisch gleich sind, d. h. ihr Inhalt ist derselbe, was auch immer im Zusammenhang mit jeder spezifischen Klasse bedeuten mag. Dies steht im Gegensatz zu den Objekten, die gleich sind: zwei verschiedene Objekte könnten logisch äquivalent sein.

Wenn Sie zu Ihrem Beispiel zurückkehren, sind a und b verschiedene Objekte, die dieselbe logische Entität darstellen - ein ganzzahliger Wert von 2 . Sie modellieren das gleiche Konzept - eine ganze Zahl, und ganze Zahlen mit dem gleichen Wert sind identisch. a und b sind daher gleich.

Die Objekte x und y hingegen repräsentieren nicht die gleiche logische Entität (sie repräsentieren tatsächlich nichts). Deshalb sind sie weder gleich noch gleichwertig.

    
dasblinkenlight 14.02.2012 13:40
quelle
0

Es ist natürlich beabsichtigt.

Beim Vergleich von Integer -Objekten gibt equals true zurück, wenn ihre Werte (in Ihrem Fall 1 ) gleich sind.

Auf verschiedene Objekte vom Typ Object angewendet, wird false zurückgegeben.

%Vor%

würde true zurückgeben.

    
Luchian Grigore 14.02.2012 13:40
quelle
0

Siehe auch Object.equals () doc . Verwenden Sie übrigens Integer.valueOf(2) anstatt new Integer(2) , da dies den Speicherbedarf reduziert.

Eine letzte lustige Sache: Integer.valueOf(2)==Integer.valueOf(2) gibt true zurück, aber Integer.valueOf(2000)==Integer.valueOf(2000) gibt false zurück, weil Sie im ersten Fall zweimal die gleiche Instanz des Integer-Objekts erhalten (es gibt einen Cache dahinter), aber nicht im zweiten Fall Der Cache ist nur für Werte zwischen -127 und 128

    
Guillaume Polet 14.02.2012 13:43
quelle

Tags und Links