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?
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!
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()
).
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.
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.
würde true
zurückgeben.
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
Tags und Links java