Comparison between variables pointing to same Integer object
The output of current program is "Strange". But both the variables share the same reference. Why are the second and third comparisons not true?
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");
}
Output: Strange
That's the artifact of autoboxing and a fact that Integer is immutable in Java.
The a++
and a--
are translated to roughly this.
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Strage
- it's obvious, the two variables point to the same objectnot
Stranger
because of autoboxing.Integer
is immutable, so each operation on it creates a new instance.not
Strangest
, because of the previous point, and because you have usednew Integer(..)
which ignores the cache that is used for the byte range. If you useInteger.valueOf(2)
initially, then the cachedInteger
s will be used andStrangest
will also be printed.
An Integer object is immutable, any change in an existing object will create a new object. So after a++
, a new object will be created and a
will start pointing to that new object while b
is still pointing to the old object. Hence, after a++
, a
and b
are pointing to different objects and a == b
will always return false.
with respect to the mentioned example :
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");
}
精彩评论