是不能改,除非新建对象
如String str = "dkdf";str的内容就是 "dkdf"
而 str = "test"; 事实上隐式的重新构造了一个对象对于StringBuffer是可以改变的
append()就实现追加,但不会重新构造

解决方案 »

  1.   

    我认为是String对象产生后,它的值就固定为一个引用地址,之后对String变量进行赋值只是它引用地址所指向的内存单元里的值改变,而String所引用的地址是不变的。
    个人意见。
      

  2.   

    我的理解是针对String 的任何操作,如果改变它的值的话,就会生成一个新的String,而不是原来那个,虽然两个对象名字相同,但是内存中指向的不是同一个区域,而原来那个string对象所在内存的内容并没有发生改变。
    ————————
    我也刚学,不知道理解的对不对。
      

  3.   

    一个String对象创建后是不能改变了,如果你给一个已有的String型变量付一个新值,它应该是改变了引用地址的!
      

  4.   

    我的理解是
    那句话中的values是指strings的引用
      

  5.   

    自己看一下jdk源码很容易理解这句话String里面使用char[]来存储的,而对char[]的改变只在构造函数里面才有,其他的任何方法都没有对char[]做改变,也就是没有副作用。许多看似有改变的地方,都是重新生成的String,而原来的String根本没发生变化顺便说一句,就连toCharArray都是重新new的char[],以防内部的引用传出来的而导致数族元素被改变
      

  6.   

    binny(骑个破车看夕阳)说的对。
      

  7.   

    to: binny(骑个破车看夕阳)
     小弟不才,想问,如果"许多看似有改变的地方,都是重新生成的String,而原来的String根本没发生变化",这么说原来的值还在?!可以取出来吗?怎么取?
      

  8.   

    "1234"是一个String类实例,而String类不提供任何可以改变内部状态的方法。如要将之改为"4321"不可能的,只能另外构造类实例。并且,无论表面上引用多少"1234",实际上都指向同一块内存拷贝。
      

  9.   

    这个例子应该可以说明问题
    class Test//String 相当于基本数据类型
    {
    static void change(String s)
    {
    s.concat("world");
    }
    public static void main(String args[])
    {
    String s1="Hello";
    String s2="World";
    change(s1);
    System.out.println("s1="+s1);
    System.out.println("s2="+s2);
    }
    }
    输出:
    s1=Hello
    s2=world
      

  10.   

    我刚刚接触java语言.理解不是那么深刻。
    我认为string是分配一个固定的指针。它指向内存的某一具体地址。它的地址不发生改变,变的应该是那个地址内的内容。
      

  11.   

    string 是个很特别的类他的new 是从栈上分配的,为了使String更快嘛而其他的类构造对象是从堆上分配的这是从String的源码上看不出来的表面上是生成了一个char[], 其实他的空间在栈上,虚拟机本来就不允许你修改栈上的内容
    其他的如int ,float等基本类别也是从栈上分配,不过和String 还是有区别的
      

  12.   

    我的理解是引用了String类后,如 String s1 = "1234" , s1 在内存中的一个位置,而1234在内存中的另一个位置,s1是1234的地址,当s1="4321"时,改变的是1234的那个内存单元,而且s1的地址也改变了,所以第一个s1才可以被垃圾回收容器回收啊
    个人意见,不知道对不对,望高手指教