指向同一个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

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

a++a--大致翻译a--这个。

 int intA = a.getInt( ); intA++; a = Integer.valueOf( intA ); // this is a reference different from b 
  • Strage – 很明显,这两个变量指向同一个对象

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

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

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