Hola a todos, soy un cerdo dominado por el repollo.
Una persona que ama estudiar, que no duerme y se olvida de comer, está obsesionada con el chico guapo de codificación chic, tranquilo e indiferente de la chica.
Si te gusta mi texto, sigue la cuenta pública "Deja ir este repollo y déjame venir".
Directorio de artículos
Boxeo y unboxing automático
Prefacio
Recientemente, me estaba preparando para futuras entrevistas de pasantías y reclutamiento de otoño. Durante el proceso de revisión, descubrí que no dominaba muchas cosas, especialmente las básicas. Muchos conceptos y detalles no se entendían en profundidad, además del mío propio. La pereza y la dilación han Siempre tuve este problema en mi corazón. De hecho, dije hace mucho tiempo que quería revisar, pero después de un mes, todavía no tomé ninguna acción. Todavía estaba muy ansioso. ¿Qué puedo hacer con el trabajo?
Por supuesto, todo esto es inútil. Digamos adiós a la ansiedad y el pánico, un paso a la vez, y luego rompamos el status quo a través de actualizaciones diarias, como un tornillo bancario, y obtengamos un pequeño punto de conocimiento todos los días.
Si no acumula pasos, no puede llegar a mil millas; si no acumula pequeñas corrientes, no puede convertirse en un río. ¡Dile adiós a los que alguna vez estuvieron ansiosos y comienza a actuar!
Hablemos hoy de autoempaquetado y desempaquetado en Java.
Presentaré qué, por qué y cómo es, por qué se hace y cómo hacerlo. Aprenda a saber por qué y por qué.
qué
¿Qué es el auto-boxing y qué es el auto-unboxing? Una vez que un chico guapo tuvo esa pregunta al codificar, ¿cómo podría aparecer repentinamente un Integer al usar int? Recientemente, cuando estaba aprendiendo JVM, fui resolviendo gradualmente las dudas en mi diversión. Char, byte, short, int, long, float, double y boolean se llaman tipos de datos básicos. Como Character, Byte, Short, Integer, Long, Float, Double, Boolean y las clases que creamos como Person, todas son una clase. Para hablar de tipos de datos, todos son tipos de datos de referencia. El primero también se denomina tipo contenedor. Por ejemplo, Integer es un tipo contenedor de int.
Debemos aclarar este concepto en nuestra mente, especialmente para distinguir int como un tipo, e Integer es una clase. La clase contiene propiedades, métodos, etc. En muchos lugares deben tratarse por separado. Por ejemplo, los tipos de datos básicos se almacenan en la pila en la JVM, mientras que las instancias de objetos se almacenan en el montón y la pila es solo una referencia a este objeto. Otro ejemplo es ==. Para tipos de datos básicos, compare sus valores, y para tipos de datos de referencia, compare la dirección de memoria del almacenamiento de objetos.
Habiendo dicho tanto, lo principal es integrar los puntos de conocimiento, aprender a comprender, aprender de otras cosas y no memorizarlo de memoria. Tanto presagio, entra en el tema.
El boxeo automático consiste en convertir automáticamente los tipos de datos básicos en tipos de envoltura;
El desempaquetado automático consiste en convertir automáticamente el tipo de contenedor en un tipo de datos básico.
por qué
Sabemos que en Java todo es un objeto. Operamos más objetos, y el propósito de empaquetarlos en una clase es permitirnos manipularlos mejor. Veamos cómo dice la documentación jdk
Integer
Clase que empaqueta unint
valor de tipo de objeto básico .Integer
El tipo de objeto comprende unint
campo de tipo.Además, esta clase proporciona varios métodos que pueden ser de
int
tipo yString
conversión mutua entre tipos, también proporciona un procesoint
útil cuando el tipo de constantes y otros métodos.
Para decirlo sin rodeos, existen muchos métodos para facilitar nuestras operaciones. Al igual que ArrayList, almacena todos los objetos y ArrayList <int> es incorrecto.
cómo
¿Cómo logran el boxeo y unboxing automático? Estoy aprendiendo JVM. Para el siguiente código, usamos javap para descompilar y echar un vistazo al contenido del archivo de código de bytes.
public class AutoBoxing {
public static void main(String[] args) {
Integer a = 1000;
int b = a + 1;
}
}
Vemos que la operación de boxeo y unboxing se realiza automáticamente durante la compilación. Boxing llama al método Integer.valueOf () y unboxing llama al método Integer.intValue ().
Si int b = a + 1; cambiamos a Integer b = a + 1; luego usamos el comando javap para descompilar
Al observar la diferencia entre las dos capturas de pantalla, descubrimos que antes de realizar operaciones aritméticas, primero las desempaquetamos y luego las empaquetamos después de los cálculos. Esto muestra que el cálculo final se convertirá en tipos de datos básicos . Inesperadamente, hay tantas cosas detrás de una línea de código tan pequeña y un signo más.
Usemos un ejemplo para entender valueOf.
public class AutoBoxing {
public static void main(String[] args) {
// Integer a = 1000;
// Integer b = a + 1;
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(c.equals(d));
}
}
Al principio, oye, 200 es igual a 200, ¿cómo es que el resultado es falso? Entonces, ¿por qué 100 es igual a 100 establecido? 200 no es igual a 200, entonces, ¿por qué se vuelven a establecer iguales? ¿El amiguito también tiene tantos signos de interrogación?
A continuación, exploraremos la esencia en profundidad. Abramos el código fuente y echemos un vistazo al método ValueOf en Integer.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Descubrimos que en el proceso de conversión, en lugar de crear directamente un objeto Integer, devuelve el elemento correspondiente al subíndice en la matriz en la clase de caché. Luego hacemos clic en la clase IntegerCache.
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
Al leer el código fuente, descubrimos que en realidad nos ayudó a crear objetos en el rango de -128-127 por adelantado. Podemos modificar el valor de 127 mediante comandos. El valor predeterminado es 127, lo que significa que en este rango, tenemos más Creado esta vez, lo que obtienes es en realidad el mismo objeto. Al igual que el grupo de subprocesos, tiene el efecto de reutilización y mejora la eficiencia. Así que piense por qué se llama IntegerCache por una razón.
Bien, entonces entenderemos por qué 100 == 100 es verdadero y 200 == 200 es falso. Como se mencionó anteriormente, == compara el valor en sí para los tipos de datos básicos y compara la dirección de memoria del objeto para los tipos de referencia. En el rango de -128 a 127, se usa el mismo objeto, por lo que la dirección de memoria es la misma, en lugar de recrear un objeto cada vez dentro de este rango, la dirección de memoria del objeto es definitivamente diferente.
Entonces, ¿por qué los iguales a continuación son todos verdaderos? Hacemos clic en el método de iguales
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Lo primero que hay que juzgar es si se trata de este tipo de Integer, en lugar de devolver falso directamente. Luego llama al método intValue para desempaquetarlo. Veamos intValue (). Es muy simple. Devuelve este valor directamente.
public int intValue() {
return value;
}
Después de desempaquetar, es el tipo de datos básico. Use = para comparar sus valores, 200 == 200, debe ser igual.
Amigos, escuchando mi explicación, ¿está claro de repente?
Explicación detallada de otros tipos
Entero que conocemos casi, ¿qué pasa con otros tipos?
Podemos saber leyendo el código fuente:
-
Byte, Short, Long son lo mismo que Integer y el rango predeterminado es de -128 a 127.
-
El carácter es de 0 a 127. Porque no tiene números negativos.
-
Float y Double no tienen este tipo de mecanismo de caché, porque si lo piensas bien, el número de novelas es incierto, hay muchos, muchos, muchos números en el medio del 0-1.
-
Boolean está representado directamente por dos objetos, el valor es Verdadero y el valor es Falso.
Muerte final
Finalmente, usamos una pregunta para juzgar si comprendemos completamente el concepto.
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==d); //true
System.out.println(e==f); //false
System.out.println(c==(a+b)); //true
System.out.println(c.equals(a+b)); //true
System.out.println(g==(a+b)); //true
System.out.println(g.equals(a+b)); //false
System.out.println(g.equals(a+h)); //true
}
Creo que después de leer este artículo, debería ser fácil resolver estos problemas. La parte difícil debe ser la penúltima y la penúltima, desembalaje y reembalaje. Tómeme como principio, el cálculo es el tipo de datos básico, igual es un método en el objeto, por lo que ambos lados deben ser objetos.
Tome la primera distancia desde la parte inferior, a + h, primero unboxing. En este momento, preste atención a una conversión de tipo, a es int, h es long, por lo que el tipo final es largo y el resultado final del boxeo es Long. El penúltimo tipo de auto-boxing es Integer, que por supuesto no es igual al tipo Long.
para resumir
En el proceso de aprendizaje, debemos aprender a captar la esencia de las cosas para permanecer sin cambios y responder a los cambios. Hay muchas artes marciales en el mundo y lo que más me gusta es Dugu Nine Swords. La espada no tiene filo y la habilidad no funciona.