关于堆栈的简单分析

关于堆栈的简单分析

代码片:

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。


我们接下来可以使用反射来进行实现。稍后分析………………

猜你喜欢

转载自blog.csdn.net/a_blackmoon/article/details/80241967