A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒙武辉 黑马帝   /  2012-2-15 01:34  /  2396 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串中StringBuffer和StringBuilder有什么区别?怎么时候用StringBuffer?怎么时候用StringBuilder?可以举个例子说明一下吗?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

9 个回复

正序浏览
王康 黑马帝 2012-2-17 10:17:05
10#
StringBuilder 是 JDK5.0 中新增加的一个类,它跟 StringBuffer 的区别看下面的介绍:
Java.lang.StringBuffer线程安全的可变字符序列。类似于 String 的字符串缓冲区,长度不可变。可将字符串缓冲区安全地用于多个线程。Java.lang.StringBuffer可以实现线程同步。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。
如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。
与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,多使用 StringBuffer 。
在大部分情况下 StringBuilder > StringBuffer
使用率选择顺序建议
StringBuilder > StringBuffer > String
回复 使用道具 举报
StringBuffer是线程安全的.StringBuilder不是线程安全的,它的运行速度比StringBuffer快.StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步。 每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。  

回复 使用道具 举报
自己玩 黑马帝 2012-2-16 23:12:05
8#
StringBuffer是线程同步的,所以自然效率低
StringBuilder是线程不同步的,效率比StringBuffer高一些
Stringbuilder相当于对StringBuffer的升级,应该是围绕升级中三要素:1,提高效率;2,简化书写,3,提高安全性的  提高安全性而来的
实际开发中建议是用StringBuilder

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
戚雪晖 黑马帝 2012-2-16 22:40:31
7#
毕老师一句经典:因为StringBuilder是后出的,因此建议使用StringBuilder{:soso_e113:}
回复 使用道具 举报
StringBuffer是同步的,效率低,安全。
StringBuilder是不同步的,效率高。
它们俩的方法没什么区别。建议使用StringBuilder

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
StringBuffer:是线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuilder:一个可变的字节序列,此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,
用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。
将StringBuilder的实例用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
StringBuffer就好比一个装东西的数据 比如这样写 StringBuffer sb= new StringBuffer()         装的时候sb.(里面装数字)  
回复 使用道具 举报
StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这个是执行效率。
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执行+=操作,最后计算它们的执行时间你就明白了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马