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 primitivo | Classe Wrapper |
boleano | boleano |
byte | Byte |
Caracteres | Personagem |
flutuador | Flutuador |
int | Inteiro |
grandes | Grandes |
curto | Curto |
Duplo | Duplo |
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 -
- O que é o JDBC?
- O que é genérico em Java?
- Groovy vs Java
- O que é herança em Java?
- Exemplos e como os genéricos funcionam em c #
- JRE vs JVM | As 8 principais diferenças com (infográficos)