请问String和String Buffer的区别
好像是String定义后就不能改变,而String Buffer可以
但指的是值改变还是什么改变?
如我定义String a ="hello",貌似可以改变为a="word"的!小弟新手,希望各位大哥赐教,谢谢!

解决方案 »

  1.   

    http://topic.csdn.net/u/20090402/11/2e5f3677-9a59-4cf6-98ee-51379d81b568.html
    和这个问题一样
      

  2.   

    String与StringBuffer的区别?如果你在网上一搜,会有非常多的答案,其中最多的就是String是不可变而StringBuffer是可变的,但是这可变与不可变究竟是什么意思呢?如果你能用IDE进行debug的话,你就会发现,String实例化以后所有的属性都是final的,而StringBuffer确不是,这就是可变与不可变。下面引用SCJP的试题来解释一下这个例子:java 代码
    public class Test {    
       public static void stringReplace (String text) {    
       text = text.replace('j' , 'i');     
       }    
           
       public static void bufferReplace (StringBuffer text) {    
       text = text.append("C");     
       }    
           
        public static void main (String args[]) {     
        String textString = new String ("java");     
        StringBuffer textBuffer = new StringBuffer ("java");     
            
        stringReplace (textString);     
        bufferReplace (textBuffer);     
            
        System.out.println (textString + textBuffer);     
        }     
        }    
    答案是 javajavaC这是因为第七行text = text.append ("C"),append方法会改变text中的值,而text与textBuffer指向的地址是相同的。因此会打印javaC再举个例子:String a = "a";  //假设a指向地址0x0001a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。因此String的操作都是改变赋值地址而不是改变值操作
      

  3.   

    String是final类型的。。
    不管你对String做什么强制修改,
    他都会重新申请内存空间来存放这个修改过的String。
    LZ说的String a ="hello"改变为a="word"
    这样的话,a已经不在原来的地址了。。
    原来存放hello的内存将会被垃圾回收。。
      

  4.   

    还有效率问题。
    String s="<a>";
    s+="<b>a</b>";
    s+="<c>b</d>";
    s+="<d>c</d>";
    s+="</a>";
    当这种操作多的时候,用String很慢的 
    用StringBuffer效率能提高好多 。
      

  5.   

    string修改对象内容时会产生新的String对象,这样会影响系统性能,而stringbuffer的数据是存放在一个缓冲区中的,如果你修改对象内容时,只是给缓冲区增加了一项数据而已,所以不会产生新的对象。
      

  6.   

    引用他帖:
    理解错误,String不可变是因为 
    1 类自身是final的 
    2 类里面的内容也是final的。比如最重要的保存字符串的部分 
    private final char value[]; 
    而StringBuilder呢? 
        public StringBuilder() { 
    super(16); 
        } 
    在 AbstractStringBuilder 里面是 
    char value[]; 
    AbstractStringBuilder(int capacity) { 
      value = new char[capacity]; 

    可见,这个char是可以变化的。通过一个 expandCapacity的方法进行扩充容量。 
    这就是区别
      

  7.   

    String不可变,每次赋值都会产生新的对象,浪费内存
    StringBuffer为可变,每次改变对象内容不会产生新的对象,不浪费内存
      

  8.   

    String的不可变指的是在类String里边的属性
    private final char value[];
    里边的字符数组一旦指定,是不能改变的,并不是说String对象的地址引用不能改变,
    当String a="hello";
    中的a又指定了一个a="world";这个时候又创建了新的String对象,而不是你原先的
    String的字符数组value改变了,ok!
      

  9.   

    我和楼主也有同样的疑问看了 5楼 和 10 楼的 回复:LZ说的String a ="hello"改变为a="word" 
    这样的话,a已经不在原来的地址了。。 
    原来存放hello的内存将会被垃圾回收。。String不可变,每次赋值都会产生新的对象,浪费内存 前者说存放hello的内存将会被垃圾回收 了 , 那就不存在占用内存的情况了 . 怎么10楼说 每次赋值都会产生新的对象,浪费内存  了呢?
      
      

  10.   

    楼主要理解改变和不可改变的本质区别。
    打个比方:
    String a="String"会为a分配一个内存区域存放字符串"String"
    而a=a+“String2”这时候不是在原有的那个内存区域上改变,而是会产生一块新的内存区域,赋值给a。这才是改变的本质。而StringBuffer是可以改变的,进行append操作的时候是在原有内存上做扩展修改的。所以要做大量字符串修改的时候建议使用Stringbuffer,那样能提升效率
    不知道我的回答是否正确
      

  11.   

    String的对象不可变是指,如下:  String a = "hello";
      a = "world";
      不可变是指第二条语句执行之后,是把a重新指向了另一个对象"world",而原来的对象"hello"(不可更改的)成为垃圾,也即是
      a指向的存储空间变了,而不是a第一次指向的存储空间里的对象变了,因为第一次指向的对象不可变。  但是StringBuffer a = "hello";
          StringBuffer a = "world";
       则是指把a第一次指向的空间里的存储内容"hello"更改为"world",那么始终只有一个对象存在内存中
      

  12.   

    java的垃圾回收机制不是说当String a ="hello"改变为a="word" 
    时,"hello"这个对象就会马上就被回收,java垃圾回收机制有许多算法,可以参见:
    http://blog.csdn.net/great1681/archive/2009/04/05/4049618.aspx
      

  13.   

    经常变化的用StringBuffer,不经常变化的用String,其实一般没什么事,用String由于他采用不变模式,如果你经常改变String会消耗内存
      

  14.   

    经常变化的用StringBuffer,不经常变化的用String,
    String只要变化就重新申请内存空间,原来的等待被回收
    StringBuffer为缓冲区域,修改的话就是对缓冲区大小、内容进行更改
    如果string经常被修改、变化,用StringBuffer会更节约内存空间,速度更快
    反之,固定不变的string用String
      

  15.   

    同意3楼和五楼的看法String 是直接占用内存
    StringBuffer 是在内存中建立一个缓冲区这就导致了5楼所说的效率问题下面有一段代码能说明效率问题:
    public class AppendStringTest{
        public static void main(String [] args){
          String text = " ";      long beginTime = System.currentTimeMillis();
          for(int i=0;i<100000;i++)
             text = text+i;
          long endTime =System.currentTimeMillis();
          System.out.println("String方法的执行时间:"+(endTime-beginTime));
          StringBuffer text2 = new StringBuffer(" ");
          beginTime = System.currentTimeMillis();
          for(int i=0;i<100000;i++)
             text2.append(String.valueOf(i));
          endTime =System.currentTimeMillis();
          System.out.println("StringBuffer方法的执行时间:"+(endTime-beginTime));  
         }
    }
     不过,现在的计算机的运行速度越来越快了,不知道运行的结果是不是很能说明问题!
      

  16.   

    http://topic.csdn.net/u/20090402/11/2e5f3677-9a59-4cf6-98ee-51379d81b568.html 
    up