Die Integer
Klasse verfügt über einen statischen Cache, in dem 256 spezielle Integer
Objekte gespeichert sind - eines für jeden Wert zwischen -128 und 127. Berücksichtigen Sie in diesem Zusammenhang den Unterschied zwischen diesen drei.
new Integer(123);
Dies macht (offensichtlich) ein brandneues Integer
Objekt.
Integer.parseInt("123");
Dies gibt int
nach dem Parsen des einen primitiven Wert zurück String
.
Integer.valueOf("123");
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, wird new Integer()
der Wert aufgerufen und übergeben, sodass Sie ein neues Objekt erhalten.
Betrachten Sie nun die drei Ausdrücke in der Frage.
Integer.valueOf("127")==Integer.valueOf("127");
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 ein Integer
Objekt beteiligt, daher kehrt dieses zurück true
.
Integer.valueOf("128")==Integer.valueOf("128");
Dies wird zurückgegeben false
, da sich 128 nicht im statischen Cache befindet. So Integer
wird für jede Seite der Gleichheit eine neue geschaffen. Da es zwei verschiedene Integer
Objekte gibt und ==
für Objekte nur zurückgegeben wird, true
wenn beide Seiten genau dasselbe Objekt sind, wird dies der Fall sein false
.
Integer.parseInt("128")==Integer.valueOf("128");
Dies vergleicht den primitiven int
Wert 128 links mit einem neu erstellten Integer
Objekt rechts. Da es jedoch nicht sinnvoll ist, ein int
mit einem zu vergleichen Integer
, wird Java das Integer
vor dem Vergleich automatisch entpacken . Sie vergleichen also am Ende ein int
mit einem int
. Da das Grundelement 128 gleich sich selbst ist, kehrt dies zurück true
.
.equals()
, andernfalls sind alle Wetten ungültig.