Java中变量常量在内存中存取的操作,以及值交换时(赋值,自增++,自减--)发生的操作

Java中变量常量在内存中存取的操作,以及值交换时(赋值,自增++,自减–)发生的操作

Java源代码在硬盘中保存,经过编译后转为class文件,在class文件运行时,JVM 虚拟机会在内存中开辟一块空间用来运行java.class。

虚拟机在内存中开辟出来的空间分为三部分,第一部分为堆区,第二部分为栈区,第三部分为存储区。存储区中有常量缓冲池,方法区和静态元素区(static)。

当我们在程序中定义一个变量时,虚拟机会在内存的堆区中存放这个变量。(注意:堆区的空间比较小,所以虚拟机会自动回收内存,例如局部变量在代码快执行结束后被回收内存)给这个变量赋值一个常量的时候,会将存储区内定义的变量指向常量缓冲池内的常量。

例如下图:

	int a=1;//在内存中的常量缓冲池取到1
	int b=a;//在堆区的a中取到1
	int c=1;//在内存中的常量缓冲池取到1

变量进行自增或自减时在内存中发生的操作
如有以下代码:

int a=1;
a=a++;
System.out.println(a);

很多初学者在遇到这样的面试或者笔试题目时,往往忽略了变量在进行自增或自减时在内存中发生的操作,一般情况下会根据++符号的位置来确定是先自增还是后自增。往往我们逻辑里的情况是,++符号在后先赋值再自增,这道题目中a=a++;。大部分没有了解过变量常量在内存的操作的初学者会认为a先将常量1赋值给等号左边的a,再进行自增操作覆盖掉a在内存中的内容,这个时候内存中的a=2,看似是这样的操作过程,但是这样思考的结果确是错的。遇到自增自减,正确的思路应该从内存入手。

在内存中,为了保持数据的完整性,防止数据在变量进行值交换时丢失,所以在进行值交换操作的时候,都会在内存中开辟一个临时的副本空间(备份空间)用来备份变量中原本存储的内容,然后再将副本空间中的内容赋值给别人,或者进行一定的操作后再赋值给别人。

看完上边的内容应该已经有了一定程度的理解,接下来我们再看自增自减符号,在内存中++符号如果在前(++a)就会先自增后备份,++符号在后(a++)就会先备份后自增。

我们再来看代码a=a++;,++符号在后是先备份后自增。a中本来存储的内容是1,在值交换时副本空间中的值也是1。这个时候a发生自增(a++),a的值变为了2,但是副本空间中的值依然为1,然后a=a++;将副本空间中的1再赋值给a,结果是a=1。

附:内存中栈在赋值和自增时发生的操作图
以后在遇到这种考察你对于底层知识掌握程度的问题时,不需要记忆那么多的解决思路,只需要理解JVM虚拟机对于内存的操作就可以解决这样的问题,达到举一反三的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值