Java Language Utilisation de int et Integer indifféremment


Exemple

Lorsque vous utilisez des types génériques avec des classes d'utilitaires, vous pouvez souvent constater que les types de nombres ne sont pas très utiles lorsqu'ils sont spécifiés comme types d'objet, car ils ne sont pas égaux à leurs homologues primitifs.

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

Heureusement, les expressions évaluées par int peuvent être utilisées à la place d'un Integer lorsque cela est nécessaire.

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

Le ints.add(i); déclaration équivaut à:

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

Et conserve les propriétés d' Integer#valueOf telles que la mise en cache des mêmes objets Integer par la JVM lorsqu'elle se trouve dans la plage de mise en cache des nombres.

Cela vaut également pour:

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

Il faut toutefois être prudent dans les situations ambiguës. Considérez le code suivant:

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

L'interface java.util.List contient à la fois une méthode remove(int index) (méthode d'interface List ) et une remove(Object o) (méthode héritée de java.util.Collection ). Dans ce cas, aucune boxe n'a lieu et on remove(int index) .

Un autre exemple de comportement de code Java étrange causé par des entiers à base de boîtes de vitesses automatiques avec des valeurs comprises entre -128 et 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

Cela se produit car l'opérateur >= appelle implicitement intValue() qui renvoie int alors que == compare les références , pas les valeurs int .

Par défaut, Java met en cache les valeurs dans la plage [-128, 127] , de sorte que l'opérateur == fonctionne car les Integers dans cette plage font référence aux mêmes objets si leurs valeurs sont identiques. La valeur maximale de la plage pouvant être mise en cache peut être définie avec l'option -XX:AutoBoxCacheMax JVM. Donc, si vous exécutez le programme avec -XX:AutoBoxCacheMax=1000 , le code suivant s'imprimera true :

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