Veamos primero un resultado de la prueba:
/*public static void main (string [] args) {entero a = 128, b = 128; Entero C = 127, d = 127; System.out.println (a == b); // false system.out.println (c == d); // true}*//*public static void main (string [] args) {integer int1 = integer.valueOf ("100"); Entero int2 = integer.valueOf ("100"); System.out.println (int1 == int2); // true}*/public static void main (string [] args) {integer int1 = integer.valueOf ("300"); Entero int2 = integer.valueOf ("300"); System.out.println (int1 == int2); // falso}El código fuente de JDK es el siguiente:
public static entero Value de (String s) lanza numberFormateException {return integer.valueOf (parseInt (s, 10)); } public static entero Value de (int i) {if (i> = integerCache.low && i <= integerCache.high) return integerCache.cache [i + (-intgerCache.low)]; devolver nuevo entero (i); }Descubrí que había otro misterio en el interior, y había una clase de IntegerCache:
Clase estática privada IntegerCache {static final int low = -128; estático final int high; Cache entero final estático []; static {// El valor alto puede configurarse mediante la propiedad int h = 127; String IntegerCacheHighPropValue = Sun.Misc.Vm.GetSavedProperty ("java.lang.integer.integercache.high"); if (integerCacheHighPropValue! = null) {try {int i = parseInt (integerCacheHighPropValue); i = math.max (i, 127); // El tamaño máximo de la matriz es integer.max_value h = math.min (i, integer.max_value -(-low) -1); } Catch (NumberFormateException nfe) {// Si la propiedad no se puede analizar en un int, ignórelo. }} high = h; caché = nuevo entero [(alto - bajo) + 1]; int j = bajo; para (int k = 0; k <cache.length; k ++) caché [k] = nuevo entero (j ++); // El rango [-128, 127] debe ser internalizado (jls7 5.1.7) afirmar integercache.high> = 127; } private integerCache () {}}Resulta que Integer instancia todos los enteros de -128 a 127 (ajustables).
Esto explica la respuesta. Resulta que no importa cuántos enteros cree en este rango, todos usan valor para producir el mismo objeto.
Pero, ¿por qué JDK tiene que hacer tanto de esta manera? Pensemos cuidadosamente en ello. La mayoría de los productos de Taobao tienen un precio de menos de 100 yuanes. ¿Cuántos enteros se utilizarán en el servidor de backend en un día? Usando IntegerCache, reduce el tiempo para obtener nuevo y mejora la eficiencia. Al mismo tiempo, JDK también proporciona configurable al alto valor de caché.
Esto indudablemente mejora la flexibilidad y facilita la optimización de JVM.
Resumir
Lo anterior es todo el contenido de este artículo sobre la lectura del código fuente Integer IntegerCache, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!