Thomas Darimont
Erfahrenes Mitglied
Hallo,
Gruß Tom
Der Java Compiler erkennt, dass ein primitiver Typ als ein Referenztyp benötigt wird und fügt automatisch eine entsprechende Auto-Boxing Operation durch. Dabei wird die statische valueOf(...) Methode der entsprechenden Wrapper-Klasse verwendet.
Die folgenden Wrapper-Typen verwenden in der valueOf- Methode einen zum Teil konfigurierbaren (*) Cache (Standard Werte Bereiche in [...] angegeben) :Byte[-128,+127], Short[-128,+127], Integer[-128,+127], Long[-128,+127], Character[0,+128], (Boolean[TRUE,FALSE])
Diese Caches bilden die primitiven Werte auf entsprechende Wrapper Typ Instanzen ab.
Wird die valueOf Methode mit einem Argument aufgerufen, dass innerhalb der Cache-Grenzen so wird
immer die selbe Wrapper-Instanz zurückgegeben.
Hierbei handelt es sich im Prinzip um das Flyweight-Design Pattern. Hierbei handelt es sich also um eine Optimierung um die Objekt-Erzeugung von Wrapper-Typen in Standardfällen zu reduzieren und somit weniger "GC-Pressure" zu erzeugen und auch "weniger" Speicher zu verbrauchen, da die entsprechenden Wrapper Instanzen im Idealfall ja nur 1-Mal vorhanden sind.
Die Wrapper-Klassen Double und Float haben keine solche Cache-Mechanismen eingebaut.
System.out.println(Integer.valueOf(1) == Integer.valueOf(1));
System.out.println(System.identityHashCode(Integer.valueOf(1)) + " = " + System.identityHashCode(Integer.valueOf(1)));
Da der Cache im Falle von Integer standardmäßig auf den Wertebereich [-128,+127] beschränkt ist, liefert die valueOf Methode ab einem Wert ober- oder unterhalb der Cache grenzen dann neue Integer Instanzen.
System.out.println(Integer.valueOf(128) == Integer.valueOf(128));
System.out.println(System.identityHashCode(Integer.valueOf(128)) + " != " + System.identityHashCode(Integer.valueOf(128)));
(*)
versuchs mal mit -Djava.lang.Integer.IntegerCache.high=1000000 oder-XX:+AggressiveOpts laufen zu lassen ;-)
Die folgenden Wrapper-Typen verwenden in der valueOf- Methode einen zum Teil konfigurierbaren (*) Cache (Standard Werte Bereiche in [...] angegeben) :Byte[-128,+127], Short[-128,+127], Integer[-128,+127], Long[-128,+127], Character[0,+128], (Boolean[TRUE,FALSE])
Diese Caches bilden die primitiven Werte auf entsprechende Wrapper Typ Instanzen ab.
Wird die valueOf Methode mit einem Argument aufgerufen, dass innerhalb der Cache-Grenzen so wird
immer die selbe Wrapper-Instanz zurückgegeben.
Hierbei handelt es sich im Prinzip um das Flyweight-Design Pattern. Hierbei handelt es sich also um eine Optimierung um die Objekt-Erzeugung von Wrapper-Typen in Standardfällen zu reduzieren und somit weniger "GC-Pressure" zu erzeugen und auch "weniger" Speicher zu verbrauchen, da die entsprechenden Wrapper Instanzen im Idealfall ja nur 1-Mal vorhanden sind.
Die Wrapper-Klassen Double und Float haben keine solche Cache-Mechanismen eingebaut.
System.out.println(Integer.valueOf(1) == Integer.valueOf(1));
System.out.println(System.identityHashCode(Integer.valueOf(1)) + " = " + System.identityHashCode(Integer.valueOf(1)));
Da der Cache im Falle von Integer standardmäßig auf den Wertebereich [-128,+127] beschränkt ist, liefert die valueOf Methode ab einem Wert ober- oder unterhalb der Cache grenzen dann neue Integer Instanzen.
System.out.println(Integer.valueOf(128) == Integer.valueOf(128));
System.out.println(System.identityHashCode(Integer.valueOf(128)) + " != " + System.identityHashCode(Integer.valueOf(128)));
(*)
versuchs mal mit -Djava.lang.Integer.IntegerCache.high=1000000 oder-XX:+AggressiveOpts laufen zu lassen ;-)
Gruß Tom