Die Anweisungsfolge Zeile 36 bis 43 unterscheidet sich von der Anweisungsfolge
Zeile 25 bis 32 nur durch die Verwendung des Variablentyps
Integer
statt
int
. In den Kommentaren sehen Sie, wie der Compiler hier Autoboxing
und Autounboxing einsetzt.
Gefährlich wird es in Zeile 39, weil dort mit
==
auf Objektidentität gestestet wird und nicht auf Gleichheit der Werte in den Objekten.
Je nach Wert wird der
if
- oder
else
-Zweig ausgeführt.
Grund ist, dass die Fabrikmethode
Integer.valueOf(int)
anders als
Boolean.valueOf(boolean)
für gleiche Werte nicht immer dasselbe (identische)
Objekt liefert. Denn dafür müsste die Klasse für alle 4.294.967.295
int
-Werte ein Objekt im Vorrat halten.
Dieser Vorrat würde über 16 Gigabyte Hauptspeicher belegen.
Immerhin gibt es einen Vorrat von 255 Objekten für die Werte -128 bis +127.
In diesem Zahlenbereich erzeugt die Fabrikmethode nicht jedes Mal ein neues Objekt.
Der Vorrat (Cache) wird übrigens in der OpenJDK-Implementierung mit einem
statischen Initialisierungsblock
erzeugt.