2010-10-27 23 views
6

me fijo un bucle sin fin, cambiando Entero a int en el siguiente:Entero objetos int vs

public class IntTest { 
    public static void main(String[] args) { 
     Integer x=-1; 
     Integer total=1000; 

     while(x != total){ 
      System.out.println("x =" + x + "total ="+ total); 
      x++; 
     } 
    } 
} 

Cuál es la razón adecuada para esto? Pensé que Integer no compararía ningún problema.

Gracias.

+0

También podría haber cambiado "x! = Total" a "total! = X". – DJClayworth

+0

Pago y envío http://www.javapractices.com/topic/TopicAction.do?Id=197 –

Respuesta

17

Porque cuando haces! = Comparando en el objeto, compara las referencias. Y las referencias entre dos objetos en el caso general son diferentes.

Cuando compara ints siempre compara primitivas, digamos no referencias (no hay objetos), sino los valores.

Por lo tanto, si desea trabajar con Entero, debe usar equals() en ellas.

Además, si sus valores están entre 0 y 255, la comparación entre Integer funciona bien, debido a la caché.

se puede leer aquí: http://download.oracle.com/javase/tutorial/java/data/numberclasses.html

+4

Por otro lado, si usó! = Entre un Entero y un int, el auto-unboxing le daría el resultado esperado. – Powerlord

+0

¿Qué hay de comparar una primitiva y un objeto, como int y entero? Es eso posible en Java – Bionix1441

2

El problema es que Integer es una clase y, por lo tanto, incluso la comparación se realiza como para cualquier otra clase, utilizando el método .equals(). Si lo compara con ==, compara las referencias que son siempre diferentes para dos instancias distintas. El tipo primitivo int no es una clase sino un tipo incorporado Java y, por lo tanto, la comparación se maneja especialmente por el compilador y funciona como se espera.

1

entero es un contenedor de clase alrededor del tipo primitivo Java int. No són la misma cosa. usted debe utilizar int en lugar de enteros, a menos que tenga una razón válida (como ArrayList<Integer> list;

5

Integer es un Object, y los objetos se comparan con .equals(..)

Sólo primitivas se comparan con ==

Esa es la regla, además de algunos casos excepcionales, donde ==puede se puede utilizar para comparar objetos. Pero incluso entonces no es aconsejable.

2

Puede utilizar Int eger.intValue() para obtener el valor int para la comparación, si realmente necesita usar Integer en absoluto.