Compreensão profunda do apagamento genérico da jvm e do açúcar sintático (unboxing e boxing)

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:
Insira a descrição da imagem aqui

Após apagar:
Insira a descrição da imagem aqui

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:
Insira a descrição da imagem aqui
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.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
E: O
Insira a descrição da imagem aqui
primeiro verdadeiro:
descompila para ver o que é chamado:
Insira a descrição da imagem aqui
o método estático Integer.valueof é executado
Insira a descrição da imagem aqui

 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:
Insira a descrição da imagem aqui
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:
Insira a descrição da imagem aqui
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
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
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

Publicado 37 artigos originais · ganhou elogios 6 · vista 4639

Acho que você gosta

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