1. Lista de tipos de wrapper

Você sabe que Java tem 8 tipos primitivos, que são tipos que não são classes. Por um lado, isso é bom — são simples e ocupam pouco espaço. Por outro lado, às vezes as aulas são exatamente o que precisamos. Você descobrirá exatamente por que isso ocorre na próxima lição.

Então, o que pode ser feito?

A partir da quinta versão do Java, cada tipo primitivo ganhou uma classe gêmea. Cada uma dessas classes armazena um único campo com um valor de um tipo específico. Essas classes são chamadas de tipos wrapper , porque agrupam valores primitivos em classes.

Aqui está uma lista desses tipos. Você conhece algum?

tipo primitivo classe wrapper
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

Os nomes dos tipos primitivos começam com uma letra minúscula, mas os nomes das classes wrapper começam com uma letra maiúscula. Alguns nomes de classe também são um pouco mais longos: Integerinstead of intи Characterinstead of char.

Todos os objetos das classes wrapper são imutáveis ​​( imutáveis ​​).

O código simplificado para a Integerclasse se parece com isto:

Código Observação
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}


Variável

Construtor




O método retorna um valor




O método estático cria um novo Integerobjeto para uma intvariável

2. Convertendo um intem umInteger

Tipos wrapper são considerados equivalentes a seus irmãos primitivos: você pode facilmente criar um objeto wrapper que corresponda a um tipo primitivo.

Vamos usar o tipo int como exemplo para analisar como os tipos primitivos interagem com seus tipos wrapper correspondentes. O código para converter de um intpara um Integere vice-versa ficaria assim:

Para converter um intpara um Integer, você precisa escrever este código:

Integer name = new Integer(value);

Onde nameé o nome de uma Integervariável e valueé o intvalor agrupado.

Exemplos:

Código Observação
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

E para converter o an Integerem an int, você precisa escrever este código:

int name = variable.intValue();

Onde nameé o nome de uma intvariável e variableé uma referência a um Integerobjeto.

Exemplos:

Código Observação
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. Autoboxing e unboxing

Mas mesmo operações simples com o Integertipo não são fáceis de escrever.

Como dissemos anteriormente, o Integertipo é imutável ( immutable ). Para criar um Integerobjeto com um novo intvalor, você precisa criar explicitamente um novo Integerobjeto. Dito isso, é fácil obter o valor de um intarmazenado dentro de um Integerobjeto — basta chamar o intValue()método.

Exemplo:

Código Descrição
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Envolver 5em um Integerobjeto
Obter o valor do Integerobjeto
Criar um novo Integerobjeto (igual a 10)

Este é um código bastante complicado, você não acha?

Os criadores de Java pensaram assim, então eles ensinaram o compilador a fazer essas operações automaticamente. A conversão automática de um intpara um Integeré chamada autoboxing (colocar automaticamente o valor em uma caixa), e a operação inversa (converter um Integerpara um int) é chamada unboxing .

Seu código O que o compilador vê
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

Graças ao autoboxing e unboxing, você pode atribuir an com segurança inta uma Integervariável e vice-versa. Você pode escrever expressões de qualquer complexidade sem fazer distinção entre os tipos inte Integer.

Exemplos:

Código O que o compilador irá gerar
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. Comparando variáveis ​​wrapper

Autoboxing e unboxing são processos simples e transparentes. Usamos new Integer()instruções conforme necessário e chamamos o intValue()método conforme necessário.

Tudo funciona bem e fácil para você, o programador. Lembre-se de que, se você comparar an Integere an Integer, a comparação será baseada em referência e não em valores.

Código Saída do console
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

As variáveis a​​e bnão armazenam intvalores. Eles armazenam referências a objetos. Isso significa que é importante lembrar como compará-los corretamente:

Errado Certo
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}