一、StringBuffer
1、简要介绍
StringBuffer 是 Java 中一个用于可变字符串操作的类。与 String 类不同,String 对象是不可变的,一旦创建就无法更改,而 StringBuffer 则允许对字符串内容进行修改,能够提高字符串操作的效率,尤其是在需要频繁修改字符串内容的场合。
StringBuffer 的所有的公共方法都是有 synchronized 关键字的,所以都是同步的,所以它在多线程中使用是线程安全的,但是由于这种对多线程情况的优化,导致它在单线程中使用性能较差。
2、字符数据的存储位置
StringBuffer 类继承自 AbstractStringBuilder 抽象类,这个抽象类中有一个字段是 value :
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
}
这个字符型数组中存储的就是 StringBuffer 对象的字符串数据,而且可以看到这个数组是可变的。
3、构造器
StringBuffer 有多个构造器:
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
// 创建一个内容为空的字符缓冲区,初始容量设为 16 个字符
public StringBuffer() {
super(16);
}
// 创建一个内容为空的字符缓冲区,初始容量由参数指定
public StringBuffer(int capacity) {
super(capacity);
}
// 创建一个字符缓冲区,并用指定字符串的内容初始化,初始容量为字符串长度加 16
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
// 创建一个字符缓冲区,内容与给定的 CharSequence 相同,初始容量为 seq 的大小加 16
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
}
我们知道 StringBuffer 的父类是 AbstractStringBuilder。我们可以查看这个 super(16) 调用父类构造器的具体结构: