Este artigo é uma nota de leitura
Apagamento genérico
A implementação de apagar genéricos quase precisa ser melhorada no compilador Javac. Não há necessidade de alterar o bytecode e a máquina virtual Java. Também garante que as bibliotecas que não usaram genéricos possam ser executadas diretamente em Java. Acima de 5.0.
Implementação de apagamento genérico:
Antes de apagar:
Após apagar:
Visível: o
apagamento do tipo Java consiste em apagar diretamente o T em tempo de compilação, programando um tipo simples como a lista ArrayList e executar a conversão forçada do tipo ao chamar;
Mas o problema surgiu:
esse código atualmente não é suportado pelo java. Se você deseja usar um tipo básico de classe de coleção, é necessário usar uma classe de empacotamento; então, o problema surge; toda vez que você chama a classe de coleção, é necessário desembalar e encaixar, o que é indubitavelmente É uma sobrecarga para o desempenho;
2. Desembalagem e embalagem automáticas
Boxe é converter automaticamente tipos de dados básicos em tipos de invólucro; unboxing é converter automaticamente tipos de invólucro em tipos de dados básicos.
E: O
primeiro verdadeiro:
descompila para ver o que é chamado:
o método estático Integer.valueof é executado
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
Portanto, pode-se ver que o mesmo objeto no pool no pool de cache é retornado
Exceda o intervalo: -128-127 não será obtido do conjunto de cache;
Portanto, o segundo falso também pode ser explicado;
O terceiro e o quarto verdadeiro:
Integer.intValue são chamados para obter o valor e o julgamento final é OK, portanto é verdadeiro
** Nota == valores iguais **
Vejamos G. Como o unboxing e a embalagem, a esquerda é um longo 3 == a direita é int 3
igual
O último:
long igual é chamado
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
Obviamente, não tipo longo, tão falso
Pode-se concluir disso:
Tipo de valor classe de embalagem boxing (valor de configuração) valueof () unboxing (obtenção de valor) xxxValue ()
== O valor é igual à premissa de que o desempacotamento é acionado à esquerda e à direita == Tornar o valor igual, e não o endereço
igual é um método de reescrita, chamando o tipo básico de método de empacotamento relacionado:
primeiro determine o tipo de instância e, em seguida, determine o valor