黑马程序员技术交流社区

标题: stringBuffer VS stringBuilder [打印本页]

作者: laiminghui    时间: 2013-9-24 11:35
标题: stringBuffer VS stringBuilder
本帖最后由 杨增坤 于 2013-9-25 07:38 编辑



stringBuffer  与  stringBuilder  有哪些区别和联系???????????



作者: 流浪的风    时间: 2013-9-24 11:45
StringBuilder是线程不安全的,所以效率比较高,1.5版本出现;
StringBuffer是线程安全的,效率相对较低,1.0版本出现的.
作者: 肖勇    时间: 2013-9-24 11:48
他们两个中的方法一模一样,只是安全问题。可以说StringBuild 是StringBuffer的升级版,前面的安全的,后面的不安全,但是后面的提高了效率。
作者: 简单ai...    时间: 2013-9-24 11:59
好好看,很好理解:

String
1,Stirng是对象不是基本数据类型
2,String是final类,不能被继承。是不可变对象,一旦创建,就不能修改它的值。
3,对于已经存在的Stirng对象,修改它的值,就是重新创建一个对象,然后将新值赋予这个对象
StringBuffer
1,一个类似于 String 的字符串缓冲区,对它的修改的不会像String那样重创建对象。
2,使用append()方法修改Stringbuffer的值,使用toString()方法转换为字符串。
Stringbuild
是jdk1.5后用来替换stringBuffer的一个类,大多数时候可以替换StringBuffer。和StringBuffer的区别在于Stringbuild是一个单线程使用的类,不值执行线程同步所以比StringBuffer的速度快,效率高。是线程非安全的。

使用举例
String s1 = “hello”;
s1=“world”;
这个操作其实是:其实是创建了两个String对象。
String s2 = "hello"
s2 += "world";
这操作是:先创建一个String对象,在接下来进行字符串连接的时候,有创建了一个StringBuild(jdk1.5前是StringBuffer),然后调用append()方法,最后调用toString()方法。
有此可以看出String对字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可变对象,使用String对字符串操作会产生大量的、多余java对象。所以结果是:影响性能,占用空间。
程序举例:
分别使用String和StringBuffer对字符串“0123456789”累加10000次,然后统计耗时多长

        String str = "0123456789";
        String str2 = "";
        int count = 10000;
        long start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            str2 += str;
        }
        long end = System.currentTimeMillis();
        long time = (end - start);
        System.out.println(time);
运行多次,在我的机器上平均时间约等于3300,即3.3秒,下面用StringBuffer来操作,查看结果
String str = "0123456789";
StringBuffer sb = new StringBuffer();
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
sb.append(str);
}
String str2 = sb.toString();
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);
同样在我的机器上结果平均结果小于10,即0.01秒,两者相差300多倍,而且随着循环次数的增加这个差距逐渐增大
结果非常明显了,如果使用StringBuild时间还会再减少,这里就不再测试了。




作者: jìng╮煜    时间: 2013-9-24 12:05
简单来讲.StringBuilder牺牲了线程安全来提高速度.StringBuffer线程安全,但速度比StringBuilder慢(以下用sbd来代替StringBuilder,    sbf代替StringBuffer)

如楼上所说,他是用了String和sbf作比较,你也可以写一下自己的代码,把sbd添入进来,看一下所运行的时间(建议循环多次.).另外,你如果会使用多线程,也对他们两个进行多线程的操控.看一下运行出来的结果会怎么样.
作者: 乔兵    时间: 2013-9-24 12:25
楼主可以尝试使用论坛搜索功能!如果问题已经解决,请重新编辑帖子,修改帖子的主题分类为“已解决”{:soso_e181:}
作者: yting_xmei1129    时间: 2013-9-24 18:36
楼主,饿前面几天刚写了一个关于你问题的blog,原文如下--->


String,StringBuffer与StringBuilder 我们经常使用,但是它们的区别在哪里呢!
String,长度不可变的
StringBuffer,长度可变,线程安全,因为它是线程安全的,所以执行效率就会低一点
StringBuilder ,长度可变,线程不安全的,同理,线程不安全,执行效率就高一点了
StringBuffer 跟 StringBuilder 长度基本是一样的,由于线程安全的问题,单线程建议用StringBuilder ,多线程建议用StringBufferArrayList与Vector 的差别也是在线程安全方面
Vector,线程安全的,里面使用了synchronized这个同步方法,通常性能上较ArrayList差
ArrayList,线程不安全的,所以性能就比Vector差一点了
ArrayList与Vector  的方法也基本一样,单线程建议用ArrayList,多线程建议用Vector


希望可以帮到楼主、、、

The you smile until forever 、、、、、、、、、、、、、、、、、、、、、
作者: HM代景康    时间: 2013-9-24 19:01
一.相同之处

       1.均是可变字符序列,可以随机的改变字符串,如追加操作或插入操作

2.均使用了内部缓冲区,并且当内部缓冲区溢出后均会自动增大

二.不同之处

      1. StringBuffer在多线程环境下使用是线程安全的,但请注意:当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步---------摘自java API。由于StringBuffer是线程安全的,因此在多线程环境下使用StringBuffer是比较合适的,但维护线程也必然需要一定的时间开销。

       2. StringBuilder在多线程环境下使用不是线程安全的,但是,在单线程环境下与StringBuffer相比,它还是占据相对的优势,因为它不需要维护线程同步,因此开销相对较低一些。





三.总结

      一般在单线程情况下建议优先使用StringBuilder

      一般在多线程情况下建议优先使用StringBuffer


作者: 近夜之星    时间: 2013-9-24 20:31
1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

作者: 0和1,编程世界    时间: 2013-9-24 20:45
StringBuffer和StringBuilder关系  2012-12-14 16:14:41|  分类: String |  标签:string  stringbuffer   |字号大

小 订阅
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执行+=操作,最后计算它们的执行时间你就明白了

作者: 陈洋    时间: 2013-9-24 22:24
        Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

       StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

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

作者: laiminghui    时间: 2013-9-27 20:53
流浪的风 发表于 2013-9-24 11:45
StringBuilder是线程不安全的,所以效率比较高,1.5版本出现;
StringBuffer是线程安全的,效率相对较低,1.0版 ...

谢谢  {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:53
肖勇 发表于 2013-9-24 11:48
他们两个中的方法一模一样,只是安全问题。可以说StringBuild 是StringBuffer的升级版,前面的安全的,后面 ...

thanks   {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:54
简单ai... 发表于 2013-9-24 11:59
好好看,很好理解:

String

thanks   {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:55
jìng╮煜 发表于 2013-9-24 12:05
简单来讲.StringBuilder牺牲了线程安全来提高速度.StringBuffer线程安全,但速度比StringBuilder慢(以下用sb ...

thanks      {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:56
yting_xmei1129 发表于 2013-9-24 18:36
楼主,饿前面几天刚写了一个关于你问题的blog,原文如下--->

thanks

{:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:57
陈洋 发表于 2013-9-24 22:24
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。 ...

thanks
                     {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:58
0和1,编程世界 发表于 2013-9-24 20:45
StringBuffer和StringBuilder关系  2012-12-14 16:14:41|  分类: String |  标签:string  stringbuffer   ...

thanks              {:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:58
近夜之星 发表于 2013-9-24 20:31
1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

thanks
{:soso_e130:}

作者: laiminghui    时间: 2013-9-27 20:59
djkyqkzj 发表于 2013-9-24 19:01
一.相同之处

       1.均是可变字符序列,可以随机的改变字符串,如追加操作或插入操作

thanks         {:soso_e130:}

作者: 血剑无痕    时间: 2013-9-28 10:49
stringBuffer是线程安全的,stringBuilder是线程不安全的。但是stringBuilder效率较高如果使用建议在局部变量中使用,因为局部变量不存在线程安全问题




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