黑马程序员技术交流社区

标题: 有谁能帮小弟理一下StringBuffer和StringBuilder的关系。 [打印本页]

作者: 吴亨    时间: 2012-2-15 21:56
标题: 有谁能帮小弟理一下StringBuffer和StringBuilder的关系。
本帖最后由 吴亨 于 2012-2-16 09:09 编辑

   求高手指点。
作者: 李杨    时间: 2012-2-15 22:19
这个是执行效率。
public class Test10
{
        public static void main(String[] args)
        {
                StringBuffer strBuf = new StringBuffer();
               
                String str = "hello";
                int times = 1500000;
               
                long beginTime = System.currentTimeMillis();
               
                for(int i = 0; i < times; i++)
                {
                        strBuf.append(str);
                }
               
                System.out.println("StringBuffer耗时:" + (System.currentTimeMillis() - beginTime));
               
                System.out.println("========================================");
               
                StringBuilder strBud = new StringBuilder();
               
                beginTime = System.currentTimeMillis();
               
                for(int i = 0; i < times; i++)
                {
                        strBud.append(str);
                }
               
                System.out.println("StringBuilder耗时:" + (System.currentTimeMillis() - beginTime));
        }
}

StringBuffer耗时:265
========================================
StringBuilder耗时:156

原因就是StringBuffer要进行同步操作,这样就大大增加了开销。
StringBuilder没有同步,相对StiringBuilder要高效很多。

随便提醒一下,加入 String str = "";要是进行str += "hello";执行那么多次的话,会消耗掉比StringBuffer上万倍的耗时。所以以后进行字符串拼接啊插入啊增加啊最好先选择
StringBuilder,要是在多线程多就要用StringBuffer。千万别用直接的字符串 += 来拼接字符串了。

你可以进行测试,就是刚才我说的让str执行+=操作,最后计算它们的执行时间你就明白了
作者: 张建银    时间: 2012-2-15 22:28
StringBuilder是对字符串操作的,不支持并发操作同一个StringBuilderr对象,
StringBuffer内部实际上也是一个StringBuilder,只是把StringBuffer 的每一个方法前加上了synchronized ,比如
StringBuilder sb=new StringBuilder();
public synchronized  StringBuffer append(String str)
{  
     sb.append(str);}
作者: 黄锦成    时间: 2012-2-15 22:32
StringBuilder是非同步的,效率比较高,这个类在jdk1.5的版本时出来的。StringBuffer是同步的,效率比较低,这个类在jdk1.0的版本就出来了。关于同步的问题,如果不知道,那要到你学习多线程的时候才能知道
作者: 许涛    时间: 2012-2-15 23:31
本帖最后由 许涛 于 2012-2-15 23:34 编辑

记得老师上课有讲过jdk升级无非是三个方面:安全、效率、书写
jdk1.5之后出现的StringBuilder则是对效率方面的提升,StringBuilder比StringBuffer高效。

总的来说就是StringBuilder效率比较高,单线程一般用StringBuilder,但是它用于多个线程
是不安全的。而StringBuffer的特点是低效,但是线程同步,较安全
作者: 吴亨    时间: 2012-2-16 09:09
谢谢,懂了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2