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

res*_*ity 17 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");
}
Run Code Online (Sandbox Code Playgroud)

输出: Strange

Ale*_*yak 21

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

a++a--被翻译成大致是这样的.

int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Run Code Online (Sandbox Code Playgroud)

  • 注意,如果用`a = Integer.valueOf(2)`替换`a = new Integer(2)`,也会打印"Strangest",因为它将使用整数缓存来获取实例. (15认同)
  • @restrictedinfinity.至少在Sun的Java中,Byte,Short和Integer具有256个值的缓存,范围从-128到127(包括-128到127),由`Type.valueOf()`方法提供.所以在我们的情况下,在`a - `之后,int值为'2`并且与我们开始时的相同,所以`Integer.valueOf(2)`将返回相同的`Integer`对象.注意,`Long`类型没有缓存,因此`Long.valueOf`总是返回一个新对象. (4认同)

Boz*_*zho 7

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

  • 不是Stranger因为自动装箱.Integer是不可变的,因此它上面的每个操作都会创建一个新实例.

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