Ich habe keine Ahnung, warum diese Codezeilen unterschiedliche Werte zurückgeben:
System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
Die Ausgabe ist:
true
false
true
Warum kehrt der erste true
und der zweite zurück false
? Gibt es etwas anderes, das ich zwischen 127
und nicht weiß 128
? (Natürlich weiß ich das 127
< 128
.)
Warum kehrt der dritte zurück true
?
Ich habe die Antwort auf diese Frage gelesen , aber ich habe immer noch nicht verstanden, wie sie zurückgegeben werden kann true
und warum der Code in der zweiten Zeile zurückgegeben wird false
.
java
integer
comparison
DnR
quelle
quelle
.equals()
, andernfalls sind alle Wetten ungültig.Antworten:
Hier gibt es einen bemerkenswerten Unterschied.
valueOf
gibt einInteger
Objekt zurück, dessen Werte möglicherweise zwischen -128 und 127 zwischengespeichert sind. Aus diesem Grund gibt der erste Wert zurücktrue
- er wird zwischengespeichert - und der zweite Wert gibt zurückfalse
- 128 ist kein zwischengespeicherter Wert, sodass Sie zwei separateInteger
Instanzen erhalten .Es ist wichtig zu beachten, dass Sie Referenzen mit vergleichen
Integer#valueOf
und wenn Sie einen Wert vergleichen, der größer ist als der vom Cache unterstützte Wert, wird er nicht ausgewertettrue
, selbst wenn die analysierten Werte äquivalent sind (Beispiel :)Integer.valueOf(128) == Integer.valueOf(128)
. Sie müssen verwendenequals()
statt.parseInt
gibt ein Primitiv zurückint
. Aus diesem Grund gibt der dritte Wert zurücktrue
-128 == 128
wird ausgewertet und ist es natürlichtrue
.Nun passiert ein gutes Stück, um das dritte Ergebnis zu erzielen
true
:Eine Unboxing-Konvertierung erfolgt in Bezug auf den von Ihnen verwendeten Äquivalenzoperator und die von Ihnen verwendeten Datentypen - nämlich
int
undInteger
. Du bekommst natürlich eineInteger
vonvalueOf
auf der rechten Seite.Nach der Konvertierung vergleichen Sie zwei primitive
int
Werte. Vergleich geschieht nur , wie Sie es mit Bezug auf Primitiven erwarten würden, so dass Sie aufzuwickeln vergleichen128
und128
.quelle
List
. Das andere ist ein Grundelement, das nur ein Rohwert ist.==
. Jedenfalls ist es jetzt klar.Die
Integer
Klasse verfügt über einen statischen Cache, in dem 256 spezielleInteger
Objekte gespeichert sind - eines für jeden Wert zwischen -128 und 127. Berücksichtigen Sie in diesem Zusammenhang den Unterschied zwischen diesen drei.Dies macht (offensichtlich) ein brandneues
Integer
Objekt.Dies gibt
int
nach dem Parsen des einen primitiven Wert zurückString
.Das ist komplexer als die anderen. Es beginnt mit dem Parsen des
String
. Wenn der Wert dann zwischen -128 und 127 liegt, wird das entsprechende Objekt aus dem statischen Cache zurückgegeben. Wenn der Wert außerhalb dieses Bereichs liegt, wirdnew Integer()
der Wert aufgerufen und übergeben, sodass Sie ein neues Objekt erhalten.Betrachten Sie nun die drei Ausdrücke in der Frage.
Dies gibt true zurück, da der
Integer
Wert 127 zweimal aus dem statischen Cache abgerufen und mit sich selbst verglichen wird. Es ist nur einInteger
Objekt beteiligt, daher kehrt dieses zurücktrue
.Dies wird zurückgegeben
false
, da sich 128 nicht im statischen Cache befindet. SoInteger
wird für jede Seite der Gleichheit eine neue geschaffen. Da es zwei verschiedeneInteger
Objekte gibt und==
für Objekte nur zurückgegeben wird,true
wenn beide Seiten genau dasselbe Objekt sind, wird dies der Fall seinfalse
.Dies vergleicht den primitiven
int
Wert 128 links mit einem neu erstelltenInteger
Objekt rechts. Da es jedoch nicht sinnvoll ist, einint
mit einem zu vergleichenInteger
, wird Java dasInteger
vor dem Vergleich automatisch entpacken . Sie vergleichen also am Ende einint
mit einemint
. Da das Grundelement 128 gleich sich selbst ist, kehrt dies zurücktrue
.quelle
Achten Sie darauf, Werte von diesen Methoden zurückzugeben. Die valueOf- Methode gibt eine Integer-Instanz zurück:
Die parseInt- Methode gibt einen ganzzahligen Wert (primitiver Typ) zurück:
Erklärung zum Vergleich:
In Ihrer Situation (gemäß den oben genannten Regeln):
Dieser Ausdruck vergleicht Verweise auf dasselbe Objekt, da er einen Integer-Wert zwischen -128 und 127 enthält, sodass er zurückgegeben wird
true
.Dieser Ausdruck vergleicht Verweise auf verschiedene Objekte, da sie Integer-Werte enthalten, die nicht in <-128, 127> enthalten sind, und gibt daher zurück
false
.Dieser Ausdruck vergleicht den primitiven Wert (linke Seite) und den Verweis auf das Objekt (rechte Seite), sodass die rechte Seite entpackt wird und sein primitiver Typ mit dem linken verglichen wird, damit er zurückkehrt
true
.quelle
==
, da es sich um unterschiedliche Objekte handelt.Integer-Objekte werden zwischen -128 und 127 von 256 Integer zwischengespeichert
Sie sollten Objektreferenzen nicht mit == oder ! = Vergleichen . Du solltest benutzen . gleich (..) oder besser - verwenden Sie das primitive int anstelle von Integer.
parseInt : Analysiert das Zeichenfolgenargument als vorzeichenbehaftete Dezimalzahl. Die Zeichen in der Zeichenfolge müssen alle Dezimalstellen sein, mit der Ausnahme, dass das erste Zeichen ein ASCII-Minuszeichen '-' ('\ u002D') sein kann, um einen negativen Wert anzuzeigen. Der resultierende ganzzahlige Wert wird genau so zurückgegeben, als ob das Argument und der Radix 10 als Argumente für die parseInt-Methode (java.lang.String, int) angegeben wurden.
valueOf Gibt ein Integer-Objekt zurück, das den aus dem angegebenen String extrahierten Wert enthält, wenn es mit dem durch das zweite Argument angegebenen Radix analysiert wird. Das erste Argument wird so interpretiert, dass es eine vorzeichenbehaftete Ganzzahl in dem durch das zweite Argument angegebenen Radix darstellt, genau so, als ob die Argumente der parseInt-Methode (java.lang.String, int) übergeben würden. Das Ergebnis ist ein Integer-Objekt, das den durch die Zeichenfolge angegebenen Integer-Wert darstellt.
gleichwertig
radix - der Radix, der bei der Interpretation von s verwendet werden soll
Also, wenn Sie
Integer.valueOf()
für die ganze Zahl dazwischen gleich sind-128 bis 127 gibt es in Ihrem Zustand true zurück
für
lesser than
-128 undgreater than
127 gibt esfalse
quelle
Beachten Sie zur Ergänzung der gegebenen Antworten auch Folgendes:
Dieser Code wird auch gedruckt:
false
Wie Benutzer Jay in einem Kommentar für die akzeptierte Antwort behauptet hat, muss bei der Verwendung des Operators
==
für Objekte vorsichtig vorgegangen werden. Hier überprüfen Sie, ob beide Referenzen gleich sind, was nicht der Fall ist, da es sich um unterschiedliche Objekte handelt, obwohl sie genau das darstellen gleicher Wert. Um Objekte zu vergleichen, sollten Sieequals
stattdessen die folgende Methode verwenden:Dies wird gedruckt:
true
Sie fragen sich vielleicht, aber warum wurde dann die erste Zeile gedruckt
true
? . Wenn Sie den Quellcode für dieInteger.valueOf
Methode überprüfen, sehen Sie Folgendes:Wenn der Parameter eine Ganzzahl zwischen
IntegerCache.low
(standardmäßig -128) undIntegerCache.high
(zur Laufzeit mit dem Mindestwert 127 berechnet) ist, wird ein vorab zugewiesenes (zwischengespeichertes) Objekt zurückgegeben. Wenn Sie also 127 als Parameter verwenden, erhalten Sie zwei Referenzen auf dasselbe zwischengespeicherte Objekt und erhalten einentrue
Vergleich der Referenzen.quelle