Conocimiento profundo de la eliminación genérica jvm y el azúcar sintáctico (unboxing y boxing)

Este artículo es una nota de lectura.

Borrado genérico

La implementación del borrado de genéricos casi solo necesita mejorarse en el compilador de Javac. No es necesario cambiar el código de bytes ni la máquina virtual de Java. También garantiza que las bibliotecas que no hayan usado genéricos puedan ejecutarse directamente en Java. Por encima de 5.0.

Implementación de borrado genérico:

Antes de borrar:
Inserte la descripción de la imagen aquí

Después de borrar:
Inserte la descripción de la imagen aquí

Visible: el
borrado de tipo Java es borrar directamente T en tiempo de compilación, programar un tipo simple como la lista ArrayList y realizar una conversión de tipo forzado al llamar;

Pero ha surgido el problema:
Inserte la descripción de la imagen aquí
java no admite este código. Si desea usar un tipo básico de clase de colección, debe usar una clase de empaquetado, entonces surge el problema, cada vez que llama a la clase de colección, tiene que desempaquetar y boxear, lo cual es indudable Es una sobrecarga para el rendimiento;

2. Desembalaje automático y embalaje

El boxeo es convertir automáticamente los tipos de datos básicos en tipos de envoltura; el desempaquetado es convertir automáticamente los tipos de envoltura en tipos de datos básicos.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Y: El
Inserte la descripción de la imagen aquí
primer verdadero:
descompilar para ver lo que se llama:
Inserte la descripción de la imagen aquí
se ejecuta el método estático Integer.valueof
Inserte la descripción de la imagen aquí

 private static class IntegerCache {
        static final int low = -128;
        static final int high;
          static {
        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);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;
          }
          一般情况下是127

Por lo tanto, se puede ver que se devuelve el mismo objeto en el grupo en el grupo de caché

Superar el rango: -128-127 no se tomará del grupo de caché;

Por lo tanto, el segundo falso también puede explicarse;

El tercer y cuarto verdadero:
Inserte la descripción de la imagen aquí
se llama a Integer.intValue para obtener el valor, y el juicio final está bien, por lo que es cierto

** Nota == valores iguales **

Veamos g. Dado que desempaquetar y empacar, la izquierda es un largo 3 == la derecha es int 3
igual

El último:
Inserte la descripción de la imagen aquí
largo igual se llama

  public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

Obviamente no tipo largo, tan falso

Se puede concluir de esto:

Tipo de valor empaquetado clase boxing (valor de configuración) valueof () unboxing (obteniendo valor) xxxValue ()

== El valor es igual a la premisa de que el unboxing se activa a la izquierda y a la derecha == Hacer que el valor sea igual, no la dirección
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
es igual, es un método de reescritura, llamando al tipo básico relacionado del método de empaquetado:
primero determine el tipo de instancia, luego determine el valor

Publicado 37 artículos originales · ganado elogios 6 · vistas 4639

Supongo que te gusta

Origin blog.csdn.net/littlewhitevg/article/details/105562495
Recomendado
Clasificación