[Preparación de la entrevista] Conceptos básicos de Java sobre el boxeo y unboxing automático

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".

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

IntegerClase que empaqueta un intvalor de tipo de objeto básico . IntegerEl tipo de objeto comprende un intcampo de tipo.

Además, esta clase proporciona varios métodos que pueden ser de inttipo y Stringconversión mutua entre tipos, también proporciona un proceso intú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;
    }
}

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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.

Inserte la descripción de la imagen aquí

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.
    Inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/weixin_44226263/article/details/112426289
Recomendado
Clasificación