Introdução ao Autoboxing e Unboxing em Java

Autoboxing é a conversão automática que o compilador Java faz entre os tipos primitivos e suas classes de wrapper de objeto correspondentes, ou seja, conversão de int para Integer, double para Double, etc. Unboxing é a conversão automática de objetos de classe de wrapper para suas primitivas equivalentes, ou seja, Integer para int etc. Esse recurso foi introduzido na versão 1.5 do java, autoboxing e unboxing, como são processos automáticos tratados pelo JRE, o ponto mais importante aqui é escrever o código adequado, que não adiciona objetos desnecessários em excesso na imagem.

Agora vamos discutir como o Autoboxing e o Unboxing em Java ocorrem internamente -

  • O compilador usa o método valueOf () para converter primitivos em objetos de invólucro correspondentes (ou seja, caixa automática) internamente; no caso inverso, usa intValue (), doubleValue () etc. como paradigmas para unboxing.
  • Para referência, o wrapper e o mapeamento de primitivas em java são mencionados abaixo -
Tipo primitivoClasse Wrapper
boleanoboleano
byteByte
CaracteresPersonagem
flutuadorFlutuador
intInteiro
grandesGrandes
curtoCurto
DuploDuplo

Exemplos -

  • Vamos pegar um ArrayList de números inteiros de vez em quando e usar o conceito de unboxing -

import java.util.ArrayList;
public class MyClass (
public static void main(String args()) (
ArrayList intlist = new ArrayList();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
)
)

  • Portanto, no exemplo acima, ao adicionar valor a x, vemos que x parece ser um primitivo; portanto, o unboxing acontece aqui automaticamente enquanto essa atribuição é feita.

public class MyClass (
public static void main(String args()) (
Integer sum =0;
for(int i=0;i<10;i++)
(
sum = sum + i;
)
System.out.println(sum);
)
)

  • Logo acima, mostramos um exemplo -2 neste contexto, onde um cenário típico foi apresentado. Se você está familiarizado com a criação de objetos em java, pode ver que "Número inteiro = 0", declara um objeto e, quando computamos dentro do loop for, podemos ver que o valor primitivo "i" está sendo adicionado ao wrapper " soma".
  • Portanto, pode-se descobrir que primeiro, a conversão do wrapper para o primitivo ocorrerá, pois o operador “+” funciona apenas em primitivos e, portanto, o descompactação de objetos ocorrerá primeiro; depois, a computação ocorrerá; a caixa automática de objetos ocorrerá novamente e, em seguida, o valor será atribuído à variável "soma".
  • Isso apresenta uma sobrecarga desnecessária na JVM, pois muitos objetos Inteiros intermediários serão criados e serão destruídos (para posterior coleta de lixo). Dessa forma, a lentidão pode aparecer, portanto essas lógicas devem ser tratadas com cuidado.
  • Vamos ver agora condições diferentes das percepções gerais e teremos algum código no qual a caixa automática e a unboxing se tornam muito importantes para serem entendidas -

Considere o trecho abaixo, qual você acha que será o resultado disso?

public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)

  • Se você está dizendo "verdadeiro", então você é "falso" porque a saída também é "falsa", é porque podemos comparar apenas o intervalo inteiro de -128 a 127 dessa forma, para valores que saem desse intervalo. sem caixa.
  • Portanto, precisamos comparar intValue () dos números inteiros acima, por enquanto, o compilador faz isso usando a propriedade valueOf ().
  • Provavelmente, se isso estiver no intervalo citado acima, o código acima será verdadeiro, pois se referirá primeiro ao conjunto literal inteiro para comparação.

public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)

Isso avaliará o valor "true", pois 100 está presente no pool literal.

Autoboxing e Unboxing em Java com sobrecarga de método

  • Antes de marcar a caixa automática e a unboxing como sobrecarga de método, presume-se que o leitor esteja familiarizado com o conceito de sobrecarga de método, forneceremos apenas algumas informações e, para mais, consulte a documentação da Oracle.
  • Sobrecarga de método é um processo em que o mesmo nome de método está sendo usado com um número diferente de argumentos de entrada, tipos de dados diferentes de variáveis ​​com os mesmos nomes, etc., usados ​​para apresentar diversas variantes de qualquer método de computação em geral.
  • Vamos dar um exemplo para o mesmo, para entendê-lo mais profundamente e também apresentaremos a saída que aparece na imagem dessa vez -

public class Main
(
public static void main(String() args) (
Overload obj = new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
)
)
class Overload
(
public void printval(int i)
(
System.out.println("printing the unboxed value "+ i);
)
public void printval(Integer i)
(
System.out.println("printing the autoboxed value "+ i);
)
)

Resultado -

imprimindo o valor fora da caixa 5
imprimindo o valor de caixa automática 5

Nota - você pode executar o programa acima em qualquer um dos IDEs para obter a saída acima.

  • Portanto, o comportamento acima diz claramente que a técnica de autoboxing tem uso significativo nos conceitos de sobrecarga e deve ser usada com cuidado durante a codificação.

Vantagens do Autoboxing e Unboxing em Java

  • A conversão apropriada é feita automaticamente pelo compilador.
  • O desenvolvedor deve escrever um código menor e, assim, um código mais limpo.
  • Não há necessidade de expressões manuais de conversão de tipo.

Conclusão

Vimos o caso de uso de autoboxing e unboxing, quão implícito é esse conceito e onde ele pode criar prós e contras. Ele deve ser usado com cuidado durante a codificação; caso contrário, pode aumentar a sobrecarga desnecessária da conversão computacional; portanto, as conversões devem ser feitas nas primitivas para evitar sobrecarga excessiva na coleta de lixo e criação excessiva de objetos temporários. Também vimos o caso de uso de autoboxing com o conceito de sobrecarga de java; você pode verificar mais algumas restrições junto com isso.

Artigos recomendados

Este foi um guia para Autoboxing e Unboxing em Java. Aqui também discutimos o que é Autoboxing e Unboxing em java? como funciona internamente com alguns códigos de amostra? Você também pode consultar nossos outros artigos sugeridos para saber mais -

  1. O que é o JDBC?
  2. O que é genérico em Java?
  3. Groovy vs Java
  4. O que é herança em Java?
  5. Exemplos e como os genéricos funcionam em c #
  6. JRE vs JVM | As 8 principais diferenças com (infográficos)