Java Language Usando int y entero indistintamente


Ejemplo

A medida que usa tipos genéricos con clases de utilidad, a menudo puede encontrar que los tipos de números no son muy útiles cuando se especifican como tipos de objetos, ya que no son iguales a sus contrapartes primitivas.

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

Afortunadamente, las expresiones que evalúan a int pueden usarse en lugar de un Integer cuando sea necesario.

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

El ints.add(i); declaración es equivalente a:

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

Y retiene las propiedades de Integer#valueOf , como tener los mismos objetos de Integer almacenados en caché por la JVM cuando está dentro del rango de almacenamiento en caché de números.

Esto también se aplica a:

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

Se debe tener cuidado, sin embargo, en situaciones ambiguas. Considere el siguiente código:

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

La interfaz java.util.List contiene tanto un remove(int index) (Método de interfaz de List ) como un remove(Object o) (método heredado de java.util.Collection ). En este caso no se lleva a cabo ningún boxeo y se llama a la remove(int index) .

Un ejemplo más del extraño comportamiento del código Java causado por los enteros automoxing con valores en el rango de -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

Esto sucede porque el operador >= llama implícitamente a intValue() que devuelve int mientras que == compara las referencias , no los valores de int .

De forma predeterminada, Java almacena en caché los valores en el rango [-128, 127] , por lo que el operador == funciona porque los Integers en este rango hacen referencia a los mismos objetos si sus valores son los mismos. El valor máximo del rango -XX:AutoBoxCacheMax se puede definir con la -XX:AutoBoxCacheMax JVM. Por lo tanto, si ejecuta el programa con -XX:AutoBoxCacheMax=1000 , el siguiente código se imprimirá true :

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