NOTE

5.14 StringBuffer

1. 是什么 线程安全的、可变字符串 其实就是在StringBuilder的基础上加了synchronized关键字 2. 如何使用 3. 原理分析 3.1. 构造函数 3.2. append方法 3.3. toString 3.4. subString

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 是什么

线程安全的、可变字符串 其实就是在StringBuilder的基础上加了synchronized关键字

2. 如何使用

public class TestStringBuilder
{
    public static void main(String[] args) throws InterruptedException
    {
        StringBuffer stringBuffer = new StringBuffer();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5000; i++)
            {
                stringBuffer.append("aaaa");
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5000; i++)
            {
                stringBuffer.append("aaaa");
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();


        System.out.println(stringBuffer.toString());
        System.out.println(stringBuffer.length() == 5000 * 2 * 4);//true

    }
}

3. 原理分析

3.1. 构造函数

 public final class StringBuffer//一样是final的
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
	public StringBuffer() {
		//跟StringBuilder一样调用AbstractStringBuilder的构造方法
		super(16);//默认容量16个
	}

}

abstract class AbstractStringBuilder implements Appendable, CharSequence {

    char[] value;
    int count;

	AbstractStringBuilder(int capacity) {
		value = new char[capacity];
	}
}

3.2. append方法

//加了synchronized修饰
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

3.3. toString

//加了synchronized修饰
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

3.4. subString

public synchronized String substring(int start, int end) {
	return super.substring(start, end);
}