Explicação detalhada da embalagem de Java e Unboxing
Prefácio:
Para entender os conceitos de embalagem e unboxing, você deve entender os tipos de dados Java
Caixa: Pacote Tipos básicos com seus tipos de referência correspondentes para fazê -los ter as propriedades dos objetos. Int empacotado em número inteiro, flutuado embalado em flutuação
Unboxing: em contraste com o boxe, simplifica objetos de tipos de referência aos dados dos tipos de valor
Inteiro a = 100;
Veja o seguinte código
M1
classe pública Datatype {public static void (string args []) {Datatype dt = new Datatype (); eger a = novo número inteiro (128); System.out.println ("M12 Result" + (a == b));Quais são os resultados da impressão?
M11 Resultado Falso M12 Resultado Falso
"==" compara o endereço, enquanto os endereços dos dois objetos A e B são diferentes, ou seja, são dois objetos, então ambos são falsos
Analisando o bytecode através do Javap, o conteúdo é o seguinte
public void m11 (); /Lang/Inteiro; Java/Lang/System.out: Ljava/IO/PrintStream; _2 30: if_acmpne 37 33: iconst_1 34: goto 38 37: iconst_0 38: InvokeVirtual #66; Java/Lang/StringBuilder.Append: (Z) LJAVA/LANG/Stringbuilder; : Retornar public void M12 (); // Método Java/Lang/Inteiro. " Novo #59; Invokespial #63; InvokeVirtual #74;
M2
classe pública Datatype {public static void (string args []) {Datatype dt = novo Datatype (); OID M22 () {Inteiro a = novo número inteiro (128); Inteiro (128);O resultado da impressão é
Resultado M21 Falsem22 Resultado Falso
A e B ainda são dois objetos
Javap Parsing Content
public void M21 (Código): Novo #44; ; // Método Java/Lang/Inteiro. " Java/lang/System.out: ljava/io/printStream; aload_2 34: if_acmpne 41 37: iconst_1 38: goto 42 41: iconst_0 42: InvokeVirtual #66; Java/Lang/StringBuilder.Append: (Z) LJAVA/LANG/Stringbuilder; : Returnpublic void M22 (); Método Java/Lang/Inteiro : Ljava/io/printream; 47: Invocar #70; 7: InvokeVirtual #70; java/lang/stringbuilder.toString :() ljava/lang/string;
m3
classe pública Datatype {public static void (string args []) {Datatype dt = new Datatype (); = 128; }}Imprimir resultados
M31 resultado truem32 resultado falso
Por que há um primeiro verdadeiro e um segundo falso? Observe os dados analisados por Javap
Javap Parsing Content
public void m31 (); : getstatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #88; #70; Lang/Inteiro.Valueof: (i) Ljava/Lang/Inteiro; Java/Lang/Inteiro.Valueof: (i) Ljava/Lang/Inteiro; 3; if_acmpne 35 31: iconst_1 32: goto 36 35: iconst_0 36: InvokeVirtual #66; InvokeVirtual #74;
M4
classe pública Datatype {public static void (string args []) {Datatype dt = new Datatype (); 2 () {Inteiro a = Inteiro.Valueof (128); System.out.println ("M42 Result" + (a == b));Imprimir resultados
M41 Resultado Truem42 Resultado Falso
Javap Parsing Content
public void m41 () Código: 0: Bipush 100 2: Invokestatic #49; : getstatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #92; #70; Lang/Inteiro.Valueof: (i) Ljava/Lang/Inteiro; Java/Lang/Inteiro.Valueof: (i) Ljava/Lang/Inteiro; 3; if_acmpne 35 31: iconst_1 32: goto 36 35: iconst_0 36: InvokeVirtual #66; InvokeVirtual #74;
analisar
O JAVAP é uma ferramenta que vem com o Java.
Vamos dar uma olhada no M4 primeiro.
Mas o objeto A é gerado chamando o número inteiro.Valueof () e B é um objeto gerado pelo boxe automático. Vamos dar uma olhada no bytecode novamente.
O método M41 aplica -se apenas ValueOf () uma vez, mas aparece duas vezes no bytecode, o que significa que o valorof () também é chamado durante o boxe automático.
A seguir, a implementação específica de ValueOf ()
/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <Code> int </code> Valor. }Em números entre [-128, 127], o valor de retorna um objeto no cache, para que as duas chamadas retornem o mesmo objeto.
Obrigado pela leitura, espero que isso possa ajudá -lo.