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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

RT StrinBuilder和StrinBuffer,StringBuilder的优点是很明显 那StringBuffer有什么好处呢

评分

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

查看全部评分

5 个回复

倒序浏览
黑马网友  发表于 2011-7-27 00:55:56
沙发
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步。 每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
回复 使用道具 举报
黑马网友  发表于 2011-7-27 01:13:07
藤椅
线程安全就是同步的,但是速度慢
线程不安全就是不同步的,但是速度快
java代码在编译的时候,会自动把安全的String转换为StringBuilder来处理,以提高效率

评分

参与人数 1技术分 +2 收起 理由
admin + 2 新手报到!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-27 09:10:30
板凳
StringBuffer不是线程安全的,但是在单线程里执行效率是比StringBuilder强一些的
回复 使用道具 举报
他们的相同点都是继承了AbstractStringBuilder类,所有方法基本相同,但是StringBuffer是线程安全的,方法前有synchronized关键字。他们的初始化大小都是16,扩容机制是新容量=(旧容量+1)×2[code=java]public StringBuilder() {
        super(16);
}[/code][code=java]public StringBuffer() {
        super(16);
}[/code][code=java]  void expandCapacity(int minimumCapacity) {
        int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
        }
        value = Arrays.copyOf(value, newCapacity);
    }[/code]StringBuffer的初始容量就很不错
比如下面的代码
1、[code=java]final int INIT_SIZE = 10;   
StringBuffer buf = new StringBuffer(INIT_SIZE); [/code]2、[code=java]StringBuffer buf = new StringBuffer();  [/code]2这句话表示初始化了一个空的初始容量为16个字符的空间大小。

1表示创建了INIT_SIZE大小的空的字符空间。

StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。 假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。
[ 本帖最后由 詹季春 于 2011-07-27  09:51 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-7-27 10:00:51
地板
StringBuffer 字符串变量(线程安全)慢,而StringBuilder 字符串变量(非线程安全)快。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马