Estoy sorprendido de que el segundo caso devuelva true
. Pero por eso en Java Puzzlers aconsejan no mezclar el uso de las clases Wrapper y el operador ==
.
Echa un vistazo a esta clase y código:
public class RichardInt {
private int value;
public RichardInt(int value) {
this.value = value;
}
}
¿Cuál sería el resultado de lo siguiente?
RichardInt aa = new RichardInt(100);
RichardInt bb = new RichardInt(100);
System.out.println(aa == bb); // prints false
Imprime falsa debido a que el operador igual ==
compara referencias cuando se utiliza con objetos. Recuerde, en Java, los objetos son tipos de referencia, mientras que las primitivas (como int
) son tipos de valores. (Nota: puede alguien que me haga saber si estoy haciendo mal uso "tipo de valor" Tengo la sensación de que soy yo?). El siguiente imprimiría cierto:
RichardInt aa = new RichardInt(100);
RichardInt bb = aa;
System.out.println(aa == bb); // prints true
... desde aa
y bb
referencia la misma instancia de RichardInt
.
Así que tal vez el comportamiento anterior sea más fácil de entender en el siguiente ejemplo ...
Intger aaa = new Intger(1000);
Intger bbb = new Integer(1000);
System.out.println(aaa == bbb); // prints false
En versiones más recientes de Java, las clases de envoltura (Integer
y Float
y Boolean
etc ...) puede auto-caja, lo que significa que puede hacer lo siguiente:
Integer aa = 1000;
// this is a shorthand for...
// Integer aa = new Integer(1000);
Pero lleva a un comportamiento confuso cuando intenta cosas como esta:
Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa == bbb); // prints false
O mejor aún, se puede acabar con los rompecabezas como éste ...
// what values of x and y will result in output?
if(!(x<y)&&!(x>y)&&!(x==y)) {
System.out.println("How is this possible?");
}
Al final, cada vez que se trata de objetos, tendrá que utilizar en lugar de .equals()
==
.
Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa.equals(bbb)); // prints true
duplicado: http://stackoverflow.com/questions/3130311/weird-java-boxing – Progman
Sí, esto es un duplicado con creces. También http://stackoverflow.com/questions/3131136/integers-caching-in-java-closed, http://stackoverflow.com/questions/1514910/when-comparing-two-integers-in-java-does-auto -unboxing-occur –