StringBuffer StringBuilder 小议

本文对比了StringBuffer和StringBuilder这两个类的区别。StringBuffer是线程安全的,而StringBuilder不是线程安全的,因此StringBuilder在单线程环境中通常具有更快的性能。文章提供了两个类的部分源码来展示其内部实现的不同。
StringBuffer 和 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 StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}

public StringBuilder append(String str) {
super.append(str);
return this;
}
`StringBuffer` 和 `StringBuilder` 的源码在 Java 中非常相似,它们都继承自 `AbstractStringBuilder`,并且大部分实现逻辑是一致的。主要区别在于 **`StringBuffer` 的方法都使用了 `synchronized` 关键字来保证线程安全,而 `StringBuilder` 没有同步机制,因此性能更高但线程不安全**。 --- ### 一、继承关系 ```java public final class StringBuffer extends AbstractStringBuilder public final class StringBuilder extends AbstractStringBuilder ``` 两者都继承自 `AbstractStringBuilder`,它封装了字符串操作的核心实现。 --- ### 二、`AbstractStringBuilder` 核心字段 ```java abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; // 构造方法等 } ``` - `value[]`:存储字符内容的数组。 - `count`:当前字符序列的长度。 --- ### 三、常用方法源码对比(以 `append(String str)` 为例) #### `StringBuffer` 源码(线程安全): ```java public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; } ``` #### `StringBuilder` 源码(线程不安全): ```java public StringBuilder append(String str) { super.append(str); return this; } ``` 可以看到,`StringBuffer` 的方法都加了 `synchronized`,而 `StringBuilder` 没有。 --- ### 四、扩容机制源码(来自 `AbstractStringBuilder`) ```java public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); 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 = (minimumCapacity > value.length) ? minimumCapacity : value.length; } value = Arrays.copyOf(value, newCapacity); } ``` 这段代码展示了字符串拼接时的扩容逻辑:当当前字符数组容量不足时,会自动扩容为原来的两倍加2。 --- ### 五、总结对比表 | 特性 | `StringBuffer` | `StringBuilder` | |------------------|------------------------------------------|----------------------------------------| | 线程安全 | 是(方法加了 `synchronized`) | 否 | | 性能 | 相对较低(因同步) | 高 | | 使用场景 | 多线程环境 | 单线程环境 | | 继承结构 | `extends AbstractStringBuilder` | `extends AbstractStringBuilder` | | 方法是否同步 | 所有方法都加了 `synchronized` | 没有同步机制 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值