随笔-0  评论-2  文章-61  trackbacks-0

Java中没有指针,但存在“引用”的概念;下面从内存分配的角度,分析一下java中的变量。以下的程序都比较简单,各位慢慢看,,

【程序一】
class main
{
  public static void main(String[] args)
  {
    String s1="Hello world1";
    String s2=s1;
    System.out.println("s1=" + s1);
    System.out.println("s2=" + s2);
    s2="abcdef";
    System.out.println("s1=" + s1);
    System.out.println("s2=" + s2);
  }
}

程序输出结果如下:
---------- 运行 ----------
s1=Hello world1
s2=Hello world1
s1=Hello world1
s2=abcdef
Normal Termination
输出完成(耗时 1 秒)。

程序分析:
String s2=s1; 从java的角度理解,应该是s2和s1共同指向了"Hello world1" 字符串所占用的内存空间;
下面的赋值s2="abcdef";又将变量s2执行了"abcdef"字符串所占用的内存空间,此时s1,s2分别指向了不同的内存空间。

【程序二】
class main
{
  public static void main(String[] args)
  {
    String s="Hello world1";
    System.out.println("s=" + s);
    s="Hello world2";
    System.out.println("s=" + s);
    s="Hello world3";
    System.out.println("s=" + s);
  }
}

程序输出结果如下:
---------- 运行 ----------
s=Hello world1
s=Hello world2
s=Hello world3
Normal Termination
输出完成(耗时 0 秒)。

程序分析:
这例程序和上例不同之处是只使用了一个变量s。
String s="Hello world1"; 定义了一个字符串的引用s,并将其指向"Hello world1"字符串所占用的内存空间;
s="Hello world2"; 使s指向了"Hello world2" 字符串所占用的内存空间;
这是"Hello world1"所占用的空间没有变量使用,会被jvm的垃圾回收机制回收。
s="Hello world3"; 也是同样的道理。

总结:
定义java变量的时候,实际上只是产生了一个指向该类型的引用(它也占用内存空间),对这个“引用”进行赋值,是将其指向某个内存空间;多次对“引用”进行赋值,jvm会产生多个内存空间,同时回收以前不用的内存空间。
有鉴于此,可知,java在使用内存方面是毫不吝惜的,变量定义与赋值时,会尽可能多的产生内存空间,不用的内存空间交给jvm的垃圾回收机制。

 

posted on 2006-12-22 09:26 comchyi 阅读(418) 评论(1)  编辑  收藏

评论:
# re: 从内存分配角度分析java变量- 2007-12-20 16:54 | 朗朗
我只是觉得比起java对象的输出操作,java对变量的赋值操作效率要高。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: