走进JDK(三)------AbstractStringBuilder、StringBuffer、StringBuilder

AbstractStringBuilder是一个抽象类,StringBuffer、StringBuilder则继承AbstractStringBuilder,所以先说AbstractStringBuilder。

AbstractStringBuilder

一、AbstractStringBuilder

//实现了两个接口,其中CharSequence这个字符序列的接口已经很熟悉了:
//1、该接口规定了需要实现该字符序列的长度:length();
//可以取得下标为index的的字符:charAt(int index);
//可以得到该字符序列的一个子字符序列: subSequence(int start, int end);
//规定了该字符序列的String版本(重写了父类Object的toString()):toString();
//2、Appendable接口顾名思义,定义添加的’规则’:
//append(CharSequence csq) throws IOException:如何添加一个字符序列
//append(CharSequence csq, int start, int end) throws IOException:如何添加一个字符序列的一部分
//append(char c) throws IOException:如何添加一个字符
abstract class AbstractStringBuilder implements Appendable, CharSequence

二、成员变量

//底层是一个char[],存储数据
char[] value;
//实际存储的数量
int count;

三、构造函数

AbstractStringBuilder() {
    }

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

四、主要方法

1、容量相

//返回已经存储的实际长度
public int length() {
        return count;
    }
//得到目前该value数组的实际大小
public int capacity() {
        return value.length;
    }
//minimumCapacity所需的最小容量
public void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > 0)
            ensureCapacityInternal(minimumCapacity);
    }
//当所需容量大于当前value的长度时,通过Arrays.copyOf创建新大小的数组
private void ensureCapacityInternal(int minimumCapacity) {
     if (minimumCapacity - value.length > 0) {
         value = Arrays.copyOf(value,
             newCapacity(minimumCapacity));
        }
    }
//如果value数组的容量有多余的,那么就把多余的全部都释放掉
public void trimToSize() {
        if (count < value.length) {
            value = Arrays.copyOf(value, count);
        }
    }

2、append

//AbstractStringBuilder提供了很多append()方法,选择重要的说
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;
    }

另外还有delete()、replace()、insert()等方法。使用场景不多,加上源码不难,有需要的时候可以自行查看。

StringBuilder

一、类定义

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

二、构造函数

    public StringBuilder() {
        super(16);
    }

    public StringBuilder(int capacity) {
        super(capacity);
    }

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }

    public StringBuilder(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

这也是为啥先学习AbstractStringBuilder的原因,大部分都是调用父类方法。

三、主要方法

对于常见的crud方法,都是使用的父类的相关方法操作。另外StringBuilder有两个private的方法

    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        s.defaultWriteObject();
        s.writeInt(count);
        s.writeObject(value);
    }

    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        count = s.readInt();
        value = (char[]) s.readObject();
    }

这也就是StringBuilder的序列化以及反序列化。

StringBuffer

一、类定义

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

其他方法StringBuffer与StringBuilder基本一致,只是多了个synchronized关键字,用来保证线程安全,但是效率相对低一些。

原文地址:https://www.cnblogs.com/alimayun/p/10686497.html