Echemos un vistazo a un código:
clase pública main {public static void main (string [] args) {entero num1 = 100; Entero num2 = 100; Entero num3 = 200; Entero num4 = 200; '' '// resultado de salida' '' system.out.println (num1 == num2); System.out.println (num3 == num4); }} ¿Adivina cuál es el resultado?
Muchas personas piensan que el resultado es cierto, pero el resultado no es así.
verdadero
FALSO
¿Por qué es este resultado? Si el resultado se explica por memoria, Num1 y Num2 apuntan al mismo objeto, mientras que Num3 y Num4 apuntan a diferentes objetos. A continuación, le digamos por qué, eche un vistazo al código fuente del Método ValorOf de Tipo Integer:
public static entero valor de (int i) {afirmar integercache.high> = 127; if (i> = integerCache.low && i <= integerCache.high) return integerCache.cache [i + 128]; devolver nuevo entero (i); }La implementación de IntegerCache:
'' '' // IntegerCache, una clase interna, tenga en cuenta que sus propiedades se definen como estática final '' 'Clase estática privada IntegerCache {static final int high; '' '' // caché superior límite, temporalmente nulo '' 'Cache entero final estático []; '' '// Cache Integer Array' '' '' // bloque, ¿por qué se define como bloque? '' '' // caché de límite inferior, inmutable. Solo el límite superior puede cambiar '' '' '' '// El valor alto puede configurarse mediante la propiedad' '' '' '' // H valor, que puede ajustarse configurando el parámetro Autoboxcachemax de JDK (hay una explicación a continuación), y el intervalo de caché automático se establece en [-128, n]. Tenga en cuenta que el límite inferior del intervalo está fijo int h = 127; if (integerCacheHighPropValue != null) { '''// Use Long.decode here to avoid invoking methods that''' '''// require Integer's autoboxing cache to be initialized''' // By decoding integerCacheHighPropValue, a candidate upper bound value is obtained ''' int i = Long.Decode (IntegerCacheHighPropvalue) .intValue (); '' '// Tome el más grande como el límite superior, pero no puede ser mayor que el límite del entero max_value' '' i = Math.max (i, 127); '' '// El tamaño máximo de la matriz es entero.max_value' '' h = math.min (i, integer.max_value - -low); } high = h; '' '// El límite superior se determina' '' '' '' '// Puede crear un bloque de caché, prestar atención al tamaño de la matriz de caché' '' Cache = new Integer [(High - Low) + 1]; // int j = bajo; para (int k = 0; k <cache.length; k ++) caché [k] = nuevo entero (j ++); '' '// -128 a los valores altos se asignan a la matriz de caché uno por uno' ''} private integerCache () {}}A través de estas dos piezas de código, se puede ver que al crear un objeto de tipo entero a través del método ValueOf, el rango de valor es [-128, 127]. En este intervalo, el puntero apunta a una referencia de objeto ya existía en IntegerCache.cache. Cuando el valor excede este rango, se creará un nuevo objeto.
Una cosa a tener en cuenta es que no todos los tipos están en este rango, mire el tipo doble:
clase pública Main {public static void main (string [] args) {double i1 = 100.0; Doble i2 = 100.0; Doble i3 = 200.0; Doble i4 = 200.0; System.out.println (i1 == i2); System.out.println (i3 == i4); }}Resultado de salida final:
FALSO
FALSO
Por la razón específica por la que este es el resultado, puede verificar la implementación del método de doble valor de valor en el código fuente. Es diferente del valor entero del método porque el número de valores enteros en un determinado rango es limitado, pero los números de puntos flotantes no lo son.
Tenga en cuenta que la implementación de valores de métodos de entero, corto, byte, carácter y largo es similar.
La implementación del Método Value de Double y Float es similar.
Tire hacia abajo uno, y los resultados del tipo booleano tienen dos verdaderos o falsos. Mire directamente el código fuente:
Public static boolean valorof (booleano b) {return (b? true: false); }Los verdaderos y falsos se definen de la siguiente manera:
public static final boolean true = new Boolean (true); '' '/**' '' '' '' '** El objeto <code> boolean </code> correspondiente al primitivo' '' '' '' '* valor <code> falso </code>. '' '' '' '**/' '' '' '' '' ''*Public Static Final Boolean false = new Boolean (falso);
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.