String s = "Hello";s = s + " world!";这两行代码执行后,结果是不变的。到底其中是怎么一回事,书上说是生成了新的字符串,那原来的呢?不懂,大虾们指教下,深入分析下。

解决方案 »

  1.   

      在这个过程中,内存中一共生成了三个字符串,‘hello','word','helloword',但指针只有一个,从指向原先的’hello'到指向最后生成的 ‘hello word',前面的两个一段时间后会被回收。
      

  2.   

    public class Foo{
    public static void main(String[] args){
    StingBuffer a=new StringBuffer("A");
    StringBuffer b=new StringBuffer("B");
    operate(a,b);
    System.out.println(a+","+b);
    }
    static void operate(StringBuffer x,StringBuffer y){
    y.append(x);
    y=x;
    }
    }
    能详细解释下这段代码吗?
      

  3.   

    LZ先弄明白String 和string buffer类不一样了么?
    String s = "Helld";
    String t;
    t = s.replace('d','o');
    那么这时候s还是原来的s,t是HelloStringBuffer st = new StringBuffer("Helld");
    st.replace('d','e');
    则st就是Hello;
      

  4.   

    可这题的结果是A,BA啊!!为什么=没起作用 呢?
      

  5.   

    public class Foo{
    public static void main(String[] args){
    StringBuffer a=new StringBuffer("A");
    StringBuffer b=new StringBuffer("B");
    operate(a,b);System.out.println(b);
    }
    static void operate(StringBuffer x,StringBuffer y){
    y.append(x);
    System.out.println(y);
    y = x ;
    System.out.println(y);}
    }这样看结果。
    y.append(x)是字符串缓冲的方法,相当于是一种引用型,改变了地址
    y = 只是值的交换,并没有改变其地址
      

  6.   

    "hello"和"world!"是不一定存在连续的空间里的,当连接两个字串时,是在内存里开辟第三块空间,然后将这两个串的内容放进去。而原本存储这两个字符串的内存空间就会被虚拟机回收
      

  7.   

    LZ再看一例
    public class Foo{
    public static void main(String[] args){
    StringBuffer a=new StringBuffer("A");
    StringBuffer b=new StringBuffer("B");
    StringBuffer c;
    c = operate(a,b);System.out.println(c);
    }
    static StringBuffer operate(StringBuffer x,StringBuffer y){
    y.append(x);y = x ;
    return y;}
    }加入返回值后结果是A,也就是说y=x生效了,但为何
    static void operate(StringBuffer x,StringBuffer y){
    y.append(x);
    y=x;
    }y=x 没有作用?这就是我刚才说a,b是String Buffer的引用对象,y.append这方法是修改地址的。而
    static void operate这是个无返回值,也就是说y = x并没有修改y的地址
      

  8.   

    我画了个图,很简陋的,不过可以说明这个问题。http://hi.csdn.net/space-2890786-do-album-view-me.html
      

  9.   

    string的对象只能生产一次,改变string的值等于new了一个新的对象,而StringBuffer,是一个一般对象,改变值不会去创建新的对象,改变的是对象的本身。=号是传值作用  开始 Y 和 b 引用都指向同一个对象B,append方法是对象B变成BA  之后y引用指向A了,所以b引用的直线对象还是BA  所以 a+“,”+b  的值为  A+“,”+BA  等于  A,BA这是全过程,引用和对象不懂得话可以看一下java编程思想,不知道LZ还满意不???