1. Elenco dei tipi di wrapper

Sai che Java ha 8 tipi primitivi, che sono tipi che non sono classi. Da un lato, questo è un bene: sono semplici e occupano poco spazio. D'altra parte, a volte le lezioni sono proprio ciò di cui abbiamo bisogno. Scoprirai esattamente perché è nella prossima lezione.

Quindi cosa si può fare?

A partire dalla quinta versione di Java, ogni tipo primitivo ha ottenuto una classe gemella. Ciascuna di queste classi memorizza un singolo campo con un valore di un tipo specifico. Queste classi sono chiamate tipi wrapper perché racchiudono i valori primitivi nelle classi.

Ecco un elenco di questi tipi. Conosci qualche?

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

I nomi dei tipi primitivi iniziano con una lettera minuscola, ma i nomi delle classi wrapper iniziano con una lettera maiuscola. Alcuni dei nomi delle classi sono anche un po' più lunghi: Integerinstead of intи Characterinstead of char.

Tutti gli oggetti delle classi wrapper sono immutabili ( immutable ).

Il codice semplificato per la Integerclasse è simile al seguente:

Codice Nota
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);
   }
}




Costruttore di variabili




Il metodo restituisce un valore




Il metodo statico crea un nuovo Integeroggetto per una intvariabile

2. Conversione di an intin anInteger

I tipi wrapper sono considerati controparti dei loro fratelli primitivi: puoi creare facilmente un oggetto wrapper che corrisponde a un tipo primitivo.

Usiamo il tipo int come esempio per analizzare come i tipi primitivi interagiscono con i tipi wrapper corrispondenti. Il codice per la conversione da an inta an Integere viceversa sarebbe simile a questo:

Per convertire an intin an Integer, devi scrivere questo codice:

Integer name = new Integer(value);

Dove nameè il nome di una Integervariabile ed valueè il intvalore racchiuso.

Esempi:

Codice Nota
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

E per convertire an Integerin an int, devi scrivere questo codice:

int name = variable.intValue();

Dove nameè il nome di una intvariabile ed variableè un riferimento a un Integeroggetto.

Esempi:

Codice Nota
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

Ma anche semplici operazioni con il Integertipo non sono facili da scrivere.

Come abbiamo detto in precedenza, il Integertipo è immutabile ( immutabile ). Per creare un Integeroggetto con un nuovo intvalore, è necessario creare esplicitamente un nuovo Integeroggetto. Detto questo, è facile ottenere il valore di un oggetto intmemorizzato all'interno di un Integeroggetto: basta chiamare il intValue()metodo.

Esempio:

Codice Descrizione
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Avvolgi 5in un Integeroggetto
Ottieni il valore dall'oggetto IntegerCrea
un nuovo Integeroggetto (uguale a 10)

Questo è un codice piuttosto ingombrante, non credi?

I creatori di Java la pensavano così, quindi hanno insegnato al compilatore come eseguire queste operazioni automaticamente. La conversione automatica di an intin an Integersi chiama autoboxing (inserimento automatico del valore in una casella) e l'operazione inversa (conversione di an Integerin an int) si chiama unboxing .

Il tuo codice Cosa vede il compilatore
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);

Grazie all'autoboxing e all'unboxing, puoi tranquillamente assegnare an inta una Integervariabile e viceversa. È possibile scrivere espressioni di qualsiasi complessità senza fare distinzione tra i tipi inte Integer.

Esempi:

Codice Cosa genererà il compilatore
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. Confronto delle variabili wrapper

Autoboxing e unboxing sono processi semplici e trasparenti. Usiamo new Integer()le istruzioni secondo necessità e chiamiamo il intValue()metodo secondo necessità.

Tutto funziona bene e facilmente per te, il programmatore. Tieni presente che se confronti an Integere an Integer, il confronto si basa sul riferimento e non sui valori.

Codice Uscita 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

Le variabili ae bnon memorizzano intvalori. Memorizzano i riferimenti agli oggetti. Ciò significa che è importante ricordare come confrontarli correttamente:

Sbagliato Giusto
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}