论坛首页 Java企业应用论坛

JAVA基本数据类型运算的内存详解

浏览 9953 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-04-15   最后修改:2010-04-15
【主题】  Java基本数据类型的运算

【关键字】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了。

注:分析中的内存地址为假设地址。
   发表时间:2010-04-15  
我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。
j=j++其实等效于:

k=j;
j=j+1;
j=k;
大家可以试试把j=j++改成 j=++j看看结果如何。

2 请登录后投票
   发表时间:2010-04-15  
不多说了,赶紧隐藏帖吧,别误导观众
0 请登录后投票
   发表时间:2010-04-15  
kaneg 写道
我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。
j=j++其实等效于:

k=j;
j=j+1;
j=k;
大家可以试试把j=j++改成 j=++j看看结果如何。



这个很显然..但是你怎么解释这个问题:
j = j ++;
我知道是先把 赋值再进行++ 操作,但是我如果不是内存中对副本(拷贝)进行的操作,那么无论赋值也好,++也罢,操作的都是同一内存区,那为什么值不发生改变列???
  jvm中,栈里面,切切实实就是,进行运算的时候都会复制一份数据..
0 请登录后投票
   发表时间:2010-04-15  
Foxswily 写道
不多说了,赶紧隐藏帖吧,别误导观众

哦? 说说你的高见..
0 请登录后投票
   发表时间:2010-04-15  
这个问题深入java虚拟机有答案 
  我记得不清楚
0 请登录后投票
   发表时间:2010-04-15  
LZ的解释明显是错误的。同意2楼的
0 请登录后投票
   发表时间:2010-04-15  
kaneg 写道
我不同意楼主用JVM内存来解释这个问题。
其实这个问题就是经典的j++ 与 ++j的区别。
j=j++其实等效于:

k=j;
j=j+1;
j=k;
大家可以试试把j=j++改成 j=++j看看结果如何。


0 请登录后投票
   发表时间:2010-04-15  
这才是正确的解释
0 请登录后投票
   发表时间:2010-04-15  
Java的基本数据类型是immutable的,这就是原因。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics