如题,知其然,更想知其所以然,希望能从根本上了解原因。
为什么StringBuffer的append方法比“+”高效?

解决方案 »

  1.   

    StringBuffer是用数组实现的,每次+不new对象,String是final类。
      

  2.   

    同意楼上,当需要对字符串进行多次修改时,最好用StringBuffer
      

  3.   

    字符串连接操作中StringBuffer的效率要比String高:  String str = new String("welcome to ");  str += "here";  的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后  再将StringBuffer toSting();  这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.  并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.  这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
      

  4.   

      String对象是不变的,如果用“+”对字符串进行修改,必然会导致String池中产生废弃的String对象。  StringBuffer和StringBuilder类型的对象能反复被修改,不会遗留废弃的Stirng对象  不考虑线程安全,StringBuffer和StringBuilder之间应优先选用StringBuilder,StringBuilder较StringBuffer运行的更快,应为StringBuffer是线程安全的
      

  5.   

    其实StringBuild的效率比StringBuffer还要好很多
    StringBuffer是线程安全的,StringBuilder不是线程安全的
      

  6.   

    每次使用String的 "+",都是new了一个新的String 对象,
    而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
    所以StringBuffer 比String 要高效 
      

  7.   

       还有一点用appeand 比 + 更安全点。 防止SQL 注入。
      

  8.   

    首先String和StringBuffer在低层实现上都是字符数组,只不过String分配的是不大不小的一个数组,你+操作的时候他会根据你+的内容在分配一个正好能容纳的数组,这样你每+操作一次都要重新创建一个新的字符数组。而StringBuffer他初始化如果不指定的话他会分配一个128长度的字符数组(如果没记错是128),然后你每append的操作他都像已创建的数组添加内容,如果快要到128的时候,他会在原有长度上创建一个128*2长度的字符数组。说白了吧,就是用小箱子和大箱子装东西的区别,小箱子装东西你要更多的做把小箱子的东西倒出来找个合适的箱子然后把新加的东西放进去。至于提到append比+更安全,能防止SQL注入攻击我真是不敢苟同,两个都是为了拼成一个字符串,在哪注入不是一样。
      

  9.   

    String新建了对象,StringBuffer可以修改
      

  10.   

    在这个帖子 42 楼,做过了一些实验,有兴趣的话可以去看一下:http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html
      

  11.   

    在每次String “+”时,JVM源码中并不是new String对象,而是new Stringbuffer 对象 
    每加一次 ,创建个新对象,所以占空间。   
      对于通过循环拼接字符串时,建议使用Stringbuffer。