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关键字,用来保证线程安全,但是效率相对低一些。