Java StringBuilder & StringBuffer 源代码分析

本文详细解析Java中三种字符串操作类(StringBuilder、StringBuffer与String)的底层实现及性能差异,通过源码分析揭示其各自的特点与适用场景,帮助开发者在实际开发中做出合理选择。

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

从资料来看都知道从操作效率比较的话,StringBuilder > StringBuffer >String. 原因是为什么呢?
StringBuilder 不是线程安全的,StringBuffer 是线程安全的,String是不可变的,操作起来会创建新对象。
下面来看看源代码的分析,
首先StringBuffer和StringBuilder都继承自AbstractStringBuilder 类,这个类完成了大部分字符串的操作,其主要的字段是个字符数组,char[] value. 在使用append方法时,主要是对字符串进行copy到一个新的字符数组。源代码如下:

public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0)
            expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
}

从这段代码来看append方法实现,其原理就是首先确保字符数组长度足够,如果不够的话,会扩充容量,容量的增加一般是(value.length+1)*2。这里为什么加1,目前没想明白。
这个类把常用的操作都实现了。StringBuilder和StringBuffer都继承了这个类,那么StringBuffer类呢,继承后都重新定义了相同名字的方法,并且是synchronized的方法。然后调用了父类的方法。以append方法为例:

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

StringBuilder类呢?也定义了相同名字的方法,只是简单的调用父类方法,并没有加锁。

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

这就是StringBuffer类和StringBuilder的区别。同步方法和没有同步的方法。实现逻辑都完全一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值