当前程序的输出是"奇怪的".但两个变量共享相同的参考.为什么第二次和第三次比较不正确?
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)
Strage - 很明显,这两个变量指向同一个对象
不是Stranger因为自动装箱.Integer是不可变的,因此它上面的每个操作都会创建一个新实例.
不是Strangest,因为前一点,并且因为你使用new Integer(..)了忽略用于字节范围的缓存.如果您Integer.valueOf(2)最初使用,则将使用缓存的Integers并且Strangest也将打印.