Chrome
任何人都可以帮助我理解堆和堆栈的内存变化。如果public class test{
public static void main(String[] args) {
Integer i = new Integer(400);
Integer x = i;
i = i + 1;
x == i;
}
}
比较记忆的地址?
答案 0 :(得分:3)
这里唯一没有解释的行是:
i = i + 1;
由于自动装箱,这一行实际上相当于:
i = Integer.valueOf(i.intValue() + 1);
^ auto-unboxing
^ autoboxing
所以intValue
的{{1}}被移动到堆栈;添加1;然后可以在堆上创建i
的新实例(因为不能保证高达401的值在内部被Integer
缓存)。
至于Integer
:假设你的意思是
x == i
由于System.out.println(x == i);
和x
是不同的实例,因此总是会打印错误。
答案 1 :(得分:1)
示例:i
指向地址a1
;
x = i
表示x
指向a1
;
i = i + 1
表示x指向地址a2
;
因此x == i
将返回false,因为a1
不等于a2
。