tamaño - variables de referencia en java
Comparación entre variables que apuntan a un mismo objeto Integer (3)
Ese es el artefacto del autoboxing y el hecho de que Integer es inmutable en Java.
El a++
y a--
se traducen aproximadamente a esto.
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
La salida del programa actual es "Extraño". Pero ambas variables comparten la misma referencia. ¿Por qué las comparaciones segunda y tercera no son ciertas?
Integer a;
Integer b;
a = new Integer(2);
b = a;
if(b == a) {
System.out.println("Strange");
}
a++;
if(b == a) {
System.out.println("Stranger");
}
a--;
if(b == a) {
System.out.println("Strangest");
}
Salida: Strange
Un objeto Integer es inmutable, cualquier cambio en un objeto existente creará un nuevo objeto. Entonces, después de a++
, se creará un nuevo objeto y empezará a apuntar a ese nuevo objeto, mientras que b
sigue apuntando al objeto anterior. Por lo tanto, después de a++
, a
y b
apuntan a diferentes objetos y a == b
siempre devolverá false.
Con respecto al ejemplo mencionado:
Integer a; //created Integer reference
Integer b; //created Integer reference
a = new Integer(2);//created new Integer Object and a reference is assigned to that new object
b = a;//b also start pointing to same Integer object
if(b == a) { // b==a will be true as both are pointing to same object
System.out.println("Strange");
}
a++; //after a++ , a new Integer object will be created (due to Integer immutablity and a will point to that new object while b is still pointing to old), so b==a will be false
if(b == a) {
System.out.println("Stranger");
}
a--; //again a new Integer Object will be created and now a will start pointing to that new Object , so b==a will be false
if(b == a) {
System.out.println("Strangest");
}
Strage
- es obvio, las dos variables apuntan al mismo objetoNo
Stranger
por autoboxing.Integer
es inmutable, por lo que cada operación crea una nueva instancia.No es
Strangest
, debido al punto anterior, y porque ha usado unnew Integer(..)
que ignora el caché que se usa para el rango de bytes. Si usaInteger.valueOf(2)
inicialmente, se usarán losInteger
s en caché y también se imprimiráStrangest
.