java - logo - apache hbase download
Caché de enteros en Java (2)
Posible duplicado:
Weird Java Boxing
Recientemente vi una presentación donde estaba el siguiente ejemplo de código Java:
Integer a = 1000, b = 1000;
System.out.println(a == b); // false
Integer c = 100, d = 100;
System.out.println(c == d); // true
Ahora estoy un poco confundido. Entiendo por qué en el primer caso el resultado es "falso", porque Integer es un tipo de referencia y las referencias de "a" y "b" son diferentes.
¿Pero por qué en el segundo caso el resultado es "verdadero"?
He escuchado una opinión, que el almacenamiento en memoria caché JVM objetos para valores int de -128 a 127 con fines de optimización. De esta manera, las referencias de "c" y "d" son las mismas.
¿Alguien puede darme más información sobre este comportamiento? Quiero entender los propósitos de esta optimización. En qué casos se aumenta el rendimiento, etc. La referencia a algunas investigaciones de este problema será excelente.
Quiero entender los propósitos de esta optimización. En qué casos se aumenta el rendimiento, etc. La referencia a algunas investigaciones de este problema será excelente.
El objetivo principal es ahorrar memoria, lo que también conduce a un código más rápido debido a una mejor eficacia de la memoria caché.
Básicamente, la clase Integer
mantiene un caché de instancias de Integer
en el rango de -128 a 127, y todos los autoboxing, literales y usos de Integer.valueOf()
devolverán instancias de ese caché para el rango que cubre.
Esto se basa en la suposición de que estos pequeños valores se producen con mucha más frecuencia que otras y, por lo tanto, tiene sentido evitar la sobrecarga de tener diferentes objetos para cada instancia (un objeto Integer
ocupa algo así como 12 bytes).
Mire la implementación de Integer.valueOf(int)
. Devolverá el mismo objeto Integer
para entradas inferiores a 256
.
EDITAR:
En realidad es -128
a +127
por defecto como se indica a continuación.