关于堆栈的简单分析
代码片:
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
System.out.println("before swap a=" + a +",b=" + b);
//swap()实现
swap(a, b);
System.out.println("after swap a=" + a +",b=" + b);
}
private static void swap(Integer num1, Integer num2) {
Integer tmp = num1;
num1 = num2;
num2 = tmp;
}运行结果:
before swap a=1,b=2
after swap a=1,b=2大家会发现其中的值并没有发生变化,可是为什么话出现这样的结果呢?就让我们一探究竟吧!
以上是堆栈的存储示意图HEAP堆中咱们一般所存储的是对象的一些值,而STACK栈内存中一般是变量本身指向heap区。A和B所指向的都是堆内存中的地址。而num1和num2是相当于A和B的一个副本所以他们所指向的值的地址是一致的。那么,为什么最终所得到的结果是一致的呢?很简单,num1和num2只是A和B的一个副本他们本身所指向的地址是没有变的。
integer底层是由final来修饰的所以他的地址是不会发生改变的。那么,我们应该如何来赋值呢?
integer内部是如何赋值的呢?
查看其字节码文件,int类型的变量,值压到了栈顶调用了integer.valueOF。
我们接下来可以使用反射来进行实现。稍后分析………………
版权声明:本文为A_BlackMoon原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。