本帖最后由 ouyangqing 于 2011-01-17 15:02:35 编辑

解决方案 »

  1.   

    用 String 来拼接字符串会浪费很多中间对象的内存
      

  2.   

    在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。这样一来 stringbuffer的效率就比string高。
    而做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
      

  3.   

    那就是说存储效率还是String类的高咯
      

  4.   

    如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
      

  5.   

    因为昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,
    我选的是追加字符串,但老师的标准答案是存储字符串,我现在就想搞明白,我的答案到底是对还是错
      

  6.   

    要解决这些问题就必须了解对于String 和StringBuffer的一些区别:
    1.Sting是一个不变的对象,一但被创建时就不能在修改它的分配的内存大小,对于已经创建的Sting类的对象进行修改后要保存到一个重新创建的String类对象中去,
    2.String类是一个被final修饰的类,是不能被继承的;
    3。StringBuffer类是一个可变得对象,当对它进行修改后,不会像String类那样要重新去创建一个对象;
    4.StringBuffer类是不能通过一个赋值号给它进行赋值的;
    5。在字符串连接中StringBuffer要比String类的效率更高一些,因为String类是不可变的每次对StringBuffer类进行修改时都要进行创建新的对象,原来的对象就没用了,要被垃圾回收掉;这会影响操作效率;
      

  7.   

    那也就是说追加效率是StringBuffer的高,存储的效率是一样的咯
      

  8.   

    我们都知道字符串其实就是一个char型的数组。而String实现内部是一个不可变的 final char[] 长度等于字符串的长度,字符串对象一旦产生就不可以修改,java的操作符+在连接字符串时被重写,每2个字符串用+号连接一次都会产生一个新的长度等于连接字符串长度之和final char[]为内部实现的新的对象,同样不可修改。每次用+连接都会这样的操作,可想而知如果大量使用+性能消耗就会很大。
    而StringBuffer实现的是一个一个可变的 char[] 默认的构造方法是长度为16的数组,如果当前StringBuffer通过append方法加入一个字符串,会先将其加入到char[]数组当中,只用当长度超过了
    char[]的长度才会先产生一个新的长度更长的char[]将旧的char[] 数据先复制到新的char[] 中再将字符串放入其中,这样一对比就可以看出来,在进行大量字符串连接的时候  StringBuffer有性能上面的优势。
    当然在一定数量级内部2者区别不大,为了表现你对2者的了解,如果刚进公司还是用StringBuffer吧 -_-。
      

  9.   

    实在不行就看源码吧,别死扣书和老师。String是不可变的对象,有修改行为的操作都生成新的实例返回。可以将它看成和int、long这些基本类型一样拥有值语义。StringBuffer、StringBuilder则可对本对象做修改,目的是提高频繁操作的效率。
    至于存储效率不是这两个类的目的。实际上,这些类一般会预留多一些的无用空间,以便在频繁操作时减少重分配内存的次数。比如说,原长度是8,append后预计长度是17,则可能会直接分配到32字节,之后append时如不超过32字节就不需重分配内存并复制。类似,Vector、ArrayList等以连续空间存储可变个元素的都用到这些策略。从这点上,存储效率不大可能比String高。
      

  10.   

    String具有不变性,对于String你处理后变成新的StringStringBuffer自身是可以改变的考虑性能有点儿多余了吧
    String str1 = "abc";
    StringBuffer sb1 = new StringBuffer("abc");
    str1.concat("def");
    sb1.append("def");
    System.out.println("str1=" + str1);
    System.out.println("sb1=" + sb1.toString());
    结果应该是
    str1=abc
    sb1=abcdef
      

  11.   

    我觉得它说的意思就是追加,就是拼接字符串更高效一下。不过,StringBuilder的效率,比StringBuffer还要高哦,只是StringBulder是非线程安全的。
      

  12.   

    我也来回一下,我是这样理解的。
    如果
    String a="stringtest";
    String b="addString";
    String nStr=a+b;
    内存中就产生了a ,b ,nStr三个对象。
    StringBuffered sb=new StringBuffered();
    sb.appand("stringtest");
    sb.appand("addString");
    这时内存中只有一个sb对象。他内存占stringtestaddString这么多,而String操作完后内存中有stringtest,addString,stringtestaddString这样String明显的占更多内存,所以效率就很明显了