Java Language Utilizzando int e Integer in modo intercambiabile


Esempio

Poiché si utilizzano tipi generici con classi di utilità, è possibile che i tipi di numeri non siano molto utili quando vengono specificati come tipi di oggetto, in quanto non sono uguali alle loro controparti primitive.

List<Integer> ints = new ArrayList<Integer>();
Java SE 7
List<Integer> ints = new ArrayList<>();

Fortunatamente, le espressioni che valutano in int possono essere utilizzate al posto di un Integer quando è necessario.

for (int i = 0; i < 10; i++)
    ints.add(i);

Il ints.add(i); la dichiarazione è equivalente a:

ints.add(Integer.valueOf(i));

E conserva le proprietà dal valore Integer#valueOf come se avesse gli stessi oggetti Integer memorizzati nella cache da JVM quando si trova nell'intervallo di memorizzazione nella cache dei numeri.

Questo vale anche per:

  • byte e Byte
  • short e Short
  • float e Float
  • double e Double
  • long e Long
  • char e Character
  • boolean e Boolean

Bisogna fare attenzione, tuttavia, in situazioni ambigue. Considera il seguente codice:

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
ints.add(3);
ints.remove(1); // ints is now [1, 3]

L'interfaccia java.util.List contiene sia un remove(int index) (metodo di interfaccia List ) che un remove(Object o) (metodo ereditato da java.util.Collection ). In questo caso non avviene la boxe e si remove(int index) .

Un altro esempio di strano comportamento del codice Java causato da autoboxing Interi con valori nell'intervallo da -128 a 127 :

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b); // true
System.out.println(c <= d); // true
System.out.println(c >= d); // true
System.out.println(c == d); // false

Ciò accade perché >= operatore chiama implicitamente intValue() che restituisce int mentre == confronta i riferimenti , non i valori int .

Per impostazione predefinita, Java memorizza nella cache i valori nell'intervallo [-128, 127] , quindi l'operatore == funziona perché i Integers di questo intervallo fanno riferimento agli stessi oggetti se i loro valori sono uguali. Il valore massimo dell'intervallo memorizzabile nella cache può essere definito con -XX:AutoBoxCacheMax opzione -XX:AutoBoxCacheMax JVM. Quindi, se esegui il programma con -XX:AutoBoxCacheMax=1000 , il seguente codice verrà stampato true :

Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // true