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:
Después de borrar:
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:
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.
Y: El
primer verdadero:
descompilar para ver lo que se llama:
se ejecuta el método estático Integer.valueof
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:
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:
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
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