锁定老帖子 主题:JAVA基本数据类型运算的内存详解
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-15
最后修改:2010-04-15
【关键字】java 基本数据类型 【问题描述】请看如果一段代码,如果不在eclipse里运行,请写出输出结果 public static void main(String[] args) { int j = 0; for(int i = 0; i < 100 ; i ++){ j = j ++; } System.out.println(j); } 很多人都会毫不犹豫说是100吧!告诉你,答案是0 【问题分析】 这和JAVA的基本数据类型的运算有关,JAVA的基本数据类型都是值引用的,这跟对象不一样.同样,在你对基本数据类型进行操作后,他会生成在内存中划分出另外一块内存区.首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重 新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。 注:分析中的内存地址为假设地址。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-15
我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。 j=j++其实等效于: k=j; j=j+1; j=k; 大家可以试试把j=j++改成 j=++j看看结果如何。 |
|
返回顶楼 | |
发表时间:2010-04-15
不多说了,赶紧隐藏帖吧,别误导观众
|
|
返回顶楼 | |
发表时间:2010-04-15
kaneg 写道 我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。 j=j++其实等效于: k=j; j=j+1; j=k; 大家可以试试把j=j++改成 j=++j看看结果如何。 这个很显然..但是你怎么解释这个问题: j = j ++; 我知道是先把 赋值再进行++ 操作,但是我如果不是内存中对副本(拷贝)进行的操作,那么无论赋值也好,++也罢,操作的都是同一内存区,那为什么值不发生改变列??? jvm中,栈里面,切切实实就是,进行运算的时候都会复制一份数据.. |
|
返回顶楼 | |
发表时间:2010-04-15
Foxswily 写道 不多说了,赶紧隐藏帖吧,别误导观众
哦? 说说你的高见.. |
|
返回顶楼 | |
发表时间:2010-04-15
这个问题深入java虚拟机有答案
我记得不清楚 |
|
返回顶楼 | |
发表时间:2010-04-15
LZ的解释明显是错误的。同意2楼的
|
|
返回顶楼 | |
发表时间:2010-04-15
kaneg 写道 我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。 j=j++其实等效于: k=j; j=j+1; j=k; 大家可以试试把j=j++改成 j=++j看看结果如何。 |
|
返回顶楼 | |
发表时间:2010-04-15
这才是正确的解释
|
|
返回顶楼 | |
发表时间:2010-04-15
Java的基本数据类型是immutable的,这就是原因。
|
|
返回顶楼 | |