Die IntegerKlasse verfügt über einen statischen Cache, in dem 256 spezielle IntegerObjekte 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 IntegerObjekt.
Integer.parseInt("123");
Dies gibt intnach 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 IntegerWert 127 zweimal aus dem statischen Cache abgerufen und mit sich selbst verglichen wird. Es ist nur ein IntegerObjekt 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 Integerwird für jede Seite der Gleichheit eine neue geschaffen. Da es zwei verschiedene IntegerObjekte gibt und ==für Objekte nur zurückgegeben wird, truewenn beide Seiten genau dasselbe Objekt sind, wird dies der Fall sein false.
Integer.parseInt("128")==Integer.valueOf("128");
Dies vergleicht den primitiven intWert 128 links mit einem neu erstellten IntegerObjekt rechts. Da es jedoch nicht sinnvoll ist, ein intmit einem zu vergleichen Integer, wird Java das Integervor dem Vergleich automatisch entpacken . Sie vergleichen also am Ende ein intmit einem int. Da das Grundelement 128 gleich sich selbst ist, kehrt dies zurück true.
.equals(), andernfalls sind alle Wetten ungültig.