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");
}
精彩评论