指向同一个Integer对象的变量之间的比较

时间:2010-06-21 14:08:10

标签: java integer

当前节目的输出是“奇怪的”。但两个变量共享相同的参考。为什么第二次和第三次比较不正确?

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");
}

输出:Strange

3 个答案:

答案 0 :(得分:21)

这是autoboxing的工件,以及Integer在Java中不可变的事实。

a++a--大致翻译为此。

int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b

答案 1 :(得分:7)

  • Strage - 很明显,这两个变量指向同一个对象

  • 由于自动装箱,
  • 不是StrangerInteger是不可变的,因此每个操作都会创建一个新实例。

  • 不是Strangest,因为前一点,并且因为您使用了new Integer(..)而忽略了用于字节范围的缓存。如果您最初使用Integer.valueOf(2),则会使用缓存的Integer,并且还会打印Strangest

答案 2 :(得分:0)

Integer对象是不可变的,对现有对象的任何更改都会创建一个新对象。因此,在a++之后,将创建一个新对象,而a仍指向旧对象时,b将开始指向该新对象。因此,在a++之后,ab指向不同的对象,并且a == b将始终返回false。

关于上述示例:

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");
}