【发布时间】:2013-06-21 20:40:28
【问题描述】:
Integer x = 400;
Integer y = x;
x++;
此时 x 是 401,y 是 400。但我认为两者都指的是同一个对象,都应该是 401。 我不知道这是怎么回事。请帮忙。
【问题讨论】:
标签: java
Integer x = 400;
Integer y = x;
x++;
此时 x 是 401,y 是 400。但我认为两者都指的是同一个对象,都应该是 401。 我不知道这是怎么回事。请帮忙。
【问题讨论】:
标签: java
在此图像中,当您增加 X=X+1 的值时,它将创建新的引用,而不是指向同一个引用。因此,在增加 X 的值后,X 将指向 401。Y 将指向 400因为 Y 没有增加。
【讨论】:
操作码说明一切。
package wrapperInteger;
public class WrapperTest {
public static void main(String[] args) {
Integer x =400;
Integer y=x;
x++;
y--;
}
}
操作码:
如果你意识到 x 对应 #16,y 对应 #22。所以证明这两个变量指向的是不同的对象。
Compiled from "WrapperTest.java"
public class wrapperInteger.WrapperTest extends java.lang.Object{
public wrapperInteger.WrapperTest();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: sipush 400
3: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: astore_1
7: aload_1
8: astore_2
9: aload_1
10: invokevirtual #22; //Method java/lang/Integer.intValue:()I
13: iconst_1
14: iadd
15: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
18: astore_1
19: aload_2
20: invokevirtual #22; //Method java/lang/Integer.intValue:()I
23: iconst_1
24: isub
25: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
28: astore_2
29: return
}
【讨论】:
java中的所有包装类都是immutable。所以每次都会创建一个新的instanceinstance。
当然为每个实例携带不同的价值。
【讨论】:
整数是不可变的。因此,当您将一些值复制到它时,它正在创建对象的一个新实例
【讨论】:
因为x++ 实际上与x = x + 1 相同。 x + 1 是一个不同 Integer 对象,x 已更新为引用此另一个对象。
【讨论】:
-XX:+AggressiveOpts可以将Integer缓存增加到10K或者20K