StringBuffer与StringBuilder的区别

本文对比分析了StringBuffer与StringBuilder的实现原理与应用场景。两者均继承自AbstractStringBuilder,但StringBuffer的方法通过synchronized关键字保证了线程安全性,适用于多线程环境;而StringBuilder则适用于单线程场景,提供更高的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看Java(1.6)源码发现StringBuffer与StringBuilder的定义如下:

 public final class StringBuffer extends AbstractStringBuilder 
		implements java.io.Serializable, CharSequence
{
...}
public final class StringBuilder extends AbstractStringBuilder 
implements java.io.Serializable, CharSequence
{
...}

可见,StringBuffer与StringBuilder拥有共同的父类AbstractStringBuilder,并实现了相同的接口java.io.Serializable, CharSequence


接着阅读代码,发现StringBuffer与StringBuilder的大部分方法都类似,不同的地方是,StringBuffer的大部分方法都用Synchronized修饰,而StringBuilder没有。例如

  public synchronized StringBuffer append(Object obj) {
	super.append(String.valueOf(obj));
        return this;
    }

    public synchronized StringBuffer append(String str) {
	super.append(str);
        return this;
    }

    public synchronized StringBuffer append(StringBuffer sb) {
        super.append(sb);
        return this;
    }
 public StringBuilder append(Object obj) {
		return append(String.valueOf(obj));
    }

    public StringBuilder append(String str) {
		super.append(str);
        return this;
    }

    private StringBuilder append(StringBuilder sb) {
		if (sb == null)
            return append("null");
		int len = sb.length();
		int newcount = count + len;
		if (newcount > value.length)
			expandCapacity(newcount);
		sb.getChars(0, len, value, count);
		count = newcount;
        return this;
    }

    public StringBuilder append(StringBuffer sb) {
        super.append(sb);
        return this;
    }


可见,StringBuffer是保证操作同步的,可以安全地用于多线程,可以在必要时对这些方法同步,因此特定实例上的操作就好像串行发生一样; StringBuilder不是线程安全的,可以理解为StringBuffer的一个简易替代,用于字符串缓冲区只被单个线程使用的情况(很普遍)。因此如何只在单个线程中操纵字符串,优先使用StringBuilder,由于不用同步控制,所以速度比StringBuffer要快。


继续阅读代码,StringBuffer和StringBuilder的共同父类AbstractStringBuilder的部分代码如下,

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char value[];

    /** 
     * The count is the number of characters used.
     */
    int count;
    ...
}
 public int length() {
		return count;
    }

    public int capacity() {
		return value.length;
    }

    public void ensureCapacity(int minimumCapacity) {
		if (minimumCapacity > value.length) {
			expandCapacity(minimumCapacity);
		}
    }

    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);
    }
可见,StringBuffer与StringBuilder的底层实现都是基于数组,并且支持动态扩展容量的。

附:String与StirngBuilder的区别

       String的定位是字符串常量的表示,在涉及到字符串拼接时,由于String对象不可变,因此是生成新的字符串对象。而StringBuilder则不用生成新的对象。

从JDK1.5开始,带有字符串的连接操作(+),JVM内部采用的是StringBuilder来实现的(即源码编译后的实现)。

参看:http://www.jb51.net/article/86551.htm




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值