Integer x = 400;
Integer y = x;
x++;
此时x是401,y是400.But我认为两者都指的是同一对象,都应该是401 我不知道这是怎么happening.please帮助。如何包装类作品
Integer x = 400;
Integer y = x;
x++;
此时x是401,y是400.But我认为两者都指的是同一对象,都应该是401 我不知道这是怎么happening.please帮助。如何包装类作品
因为x++
实际上与x = x + 1
相同。 x + 1
是不同Integer
对象,并且x
被更新以引用该另一个对象。
+1由于自动装箱,它可能不会创建一个新的Integer ,但它将是一个不同的Integer。例如'-XX:+ AggressiveOpts'可以将Integer缓存增加到10K或20K –
谢谢...知道了吧 –
请看看我的答案,它证明来自不同的完美。 –
整数是不可变的。所以,当你复制一些值它是创建对象的新实例
Java中的所有包装类immutable
。所以object
新instance
创建每个时间。 当然为每个实例携带不同的值。
Opcode说的都是。
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
}
谢谢...你能请给我打电话更多关于操作码..它描述什么..如何得到这段代码 –
> javap -c WrapperTest.class打印Java编译代码。 Opcode就像一个由JVM执行的机器语言。 JVM执行此代码。 –
这里在此图像中,当你增加X值= X + 1,那么它会创建新的参考而不是指向同一one.So递增X的值之后,X将指向401.Andÿ将指向400,因为Y不会递增。
标题似乎误导,我想你需要看到这个http://stackoverflow.com/questions/4712798/how-to-use-references-in-java或http://stackoverflow.com/questions/40480/is-java-pass-by-reference –
http://stackoverflow.com/questions/13098143/java-integer-constant-pool – Santosh