String str="abc";
隐含创建一个“abc”的String对象
并把它作为str的引用
str="abcaa";
创建一个“abcaa”的String对象
并把vstr的引用改为这个对象这时“abc”不再被引用,等着被GC回收

解决方案 »

  1.   

    to:flyingbug(小兵张噶):如果你的解釋正確(還有待驗証)
    那麼,String str=new String("abc");和String str="abc";之間有什麼區別?
      

  2.   

    String比较特殊,假如不用new的话,不是在堆中创建,可以理解为在jvm的另外一片空间,当你使用String a="gg";他先到那片空间看常量"aa"是否存在,假如存在,那么返回那个地址,假如不存在则在那个空间中添加一个"aa",所以String a="aa";String b="aa";都是指向那片空间的同一个地址,这是我说的题外话哈.但是人家说Strings are constant是指,当你执行str="abcaa";的时候,不是将"abcaa"给赋值到那篇空间中去,而是说的是从那篇空间中找到"abcaa"的地址值付给str这个所指向的栈
      

  3.   

    new指的是从堆中分配一片空间付给str引用,而使用等号,就想我上面说得是从"那个"空间取得值,在"那个"空间中不可能存在两个或多个相同的字符常量,切记,所以才有:
    String a="g";
    String b="a";
    (a==b)为真的事实
      

  4.   

    同意  flyingbug(小兵张噶) String str="abc";
    然后会分配空间来存储字符串str的值abc
    占用的这锻地址空间直到没有任何指针指向它然后被回收这个过程中,他的地址空间,长度,值都是不变的。
      

  5.   

    to:flyingbug(小兵张噶) 这种情况,这时“abc”不再被引用,是不会被回收的,他不是堆中的分配,和MFC里面的核心对象差不多,属于系统的
      

  6.   

    假如是String a=new String("gg");则要被回收
      

  7.   

    to: shangqiao(伤桥),首先謝謝你熱情回答我的問題!,現在思路總算清晰了很多
    你說的
    假如是String a=new String("gg")(這種情況是在堆中創建);则要被回收,否則如果是
    String str="abc";則不會被回收,對于這种情況我在看thinking in java中看到過這一點,在這里謝謝你再次提醒我.
    但是我有一點還是不是很明白:
    如果是String str="abc";以這种方式創建的字符串對象不是在堆中創建,您說它是在JVM中分配的另外一塊空間,那它究竟是在什么地方創建(寄存器/棧/靜態存儲/非RAM存儲或是別的地方)?
    另外,它在創建之後如果不會被GC回收,那它豈不是會在內存中一直存在,最終會導致內存溢出嗎?
    對於以上兩种情況,請你能繼續關注我的問題,謝謝!
      

  8.   

    对不起楼主,下班前着急的回了这个帖子
    回来的路上仔细想想
    发现说错了
    所以到家赶紧上网纠正,免得被骂^_^(看来已经被骂了)对于String str="abc";
    最后一句说错,不是被GC回收但是shangqiao(伤桥)有个地方也说错了
    String a=new String("gg")不只是在堆中创建
    准确的说是在堆中创建“gg”,然后复制到栈中的a对象中,这就是复制过程
    而String str="abc";是直接在栈中创建所以,无论是String str="abc";中的str
    还是String a=new String("gg")中的a
    都是在创建它们的类或者线程的私有栈中生存,其生存周期同创建它们类或线程
    当创建它们的类或线程死掉,它们也从栈中弹出,私有变量栈消失关于这个问题可以看看java rules里面有涉及,但翻译的太烂,所以也不是很详细
    最简单的做法运用IDE跟踪
    Optimizeit配合JBuilder可以看到
    在Optimizeit可以跟踪堆变量
    在JBuilder中可以跟踪栈变量,跑一个程序看看就知道了
      

  9.   

    另外,只有String是在堆中创建,然后复制到栈中的
    其他的基本类型都是在堆中创建然后传引用到栈中的
    也就是说栈中都是引用,只有String要复制过来