网上关于此两者的讨论太多了,但今天看了O'Reilly的Better Faster Lighter Java时,有些别的看法,例如:
String middle = "very, ";String prefix "This code is ";String suffix = "ugly."String result = "";StringBuffer buffer = new StringBuffer( );buffer.append(prefix);for (int i= 0; i<5; i++) {  buffer.append(middle);}buffer.append(suffix);result = buffer.toString( );
or this one:String result = "This code is ";for (int i= 0; i<5; i++) {  result = result + "much, ";}result = result + "simpler, and neater.";
O'Reilly对此的看法是他并不觉得使用第一种编码会比第二种,实际上,以前旧版本的jvm是不会对string的拼接操作进行优化的,使得每次在进行拼接string时会再生成一个新的对象,因此,当循环数非常大时,例如10000个,你可以在内存中看到10000多个对象(没有回收的前提下),因此对于上千个并发来说,这个是相当恐怖的,但现在的JVM已经相当优化了,它会对string进行解释,因此,他认为上面两种在大批次循环是没有什么区别的,到最后,你同样要maintain a bigger blob of uglier code until the end of time,其实,如果在JVM有进行优化的前提下,第二种是在牺牲了一小部分性能的前提下达到了维护的方便性的,和代码的可读性的,因此个人也同意O'Reilly的看法,呵呵,欢迎大家继续讨论.

解决方案 »

  1.   

    想问一下StringBuffer和StringBuilder有啥不同呢?
      

  2.   

    通过反编译可以看出.string 在使用操作符"+"时是创建一个StringBuilder来构造最后的Stirng.但是,这种优化程度相比单纯使用StringBuilder是有限的..具体你可以参考下thinking in java第四版中文版284页.讲解得很清楚..
      

  3.   

    String 和 StringBuffer的区别
    String 在每次 进行字符串想加的时候都会在  内存的堆里去创建一个对象 同时 还会在String pool池里去创建一个对象
    而StringBuffer 则不同,他是在原有的对象的基础上进行修改
    则StringBuffer的性能肯定是高于String
      

  4.   

    java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快
      

  5.   

    实际上,并不一定,优化的JVM会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检
      

  6.   

    我是从5.0才开始真正了解java 的一般用字符串拼接,直接就用java.lang.StringBuilder。还没考需过这方面的问题。只是知道它的效率能快些。不过LZ说String已经优化了,那么就应该效率差不多了吧
      

  7.   

    如果你显示地调用String.intern(),实际上在对String进行操作时,是不会进行new的操作的
      

  8.   

    实际上,"StringBuffer的性能肯定是高于String"我并同意这样,因为你没有考虑到运行期和编译期,运行期是不可预料的,而编译期是可预料的,你可以写代码测试一下,可以发现"+"的效率比stringbuffer高很多
      

  9.   

    不过大部分时间,stringbuffer效率是比string高的,不过,本文其实只是想讨论一个取舍的问题,因为采用stringbuffer,进行大批次append时,代码可读性比较差,不像"+"那么直接
      

  10.   

    执行期应该没什么问题因为优化时候会优化成StringBuffer
      

  11.   

    StringBuilder最高
    StringBuffer次之
    String再次之
      

  12.   

    1,StringBuilder效率比前者高
    2,StringBuilder是jdk 5.0后才有的。
      

  13.   

    现在java语言的发展就是为了提高速率和增强动态性
    所以才有了StringBuilder的诞生
      

  14.   

    一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容为 "start" 的字符串的生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含 "startle",而 z.insert(4, "le") 将更改字符串生成器,使之包含 "starlet"。 通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer
      

  15.   

    从1.5以后,jvm的确做了大量的优化,但最优的还是要自己控制,比如kbyst说的:只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 sb.insert(sb.length(), x) 中,如果有指定初始化长度,你会发现,整个的效率会提高至少10%,同理vector等也是一样