这个抽象类是StringBuilder和StringBuffer的直接父类,而且定义了很多方法,因此在学习这两个类之间建议先学习 AbstractStringBuilder抽象类 该类在源码中注释是以JDK1.5开始作为前两个类的父类存在的,可是直到JDK1.8的API中,关于StringBuilder和StringBuffer的父类还是Object
一、类定义
代码语言:javascript复制abstract class AbstractStringBuilder implements Appendable, CharSequence {}
类名用abstract修饰说明是一个抽象类,只能被继承,不能直接创建对象。但是它就一个抽象方法,toString方法。
实现了两个接口:
- CharSequence:这个字符序列的接口已经很熟悉了,用来表示一个有序字符的集合
- ApAppendable接口能够被追加 char 序列和值的对象。如果某个类的实例打算接收来自 Formatter 的格式化输出,那么该类必须实现 Appendable 接口。
二、成员变量
代码语言:javascript复制/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
和String中的变量不同,内部的char[] value,不再是final的了,也就意味着可变
三、构造方法
代码语言:javascript复制 /**
* This no-arg constructor is necessary for serialization of subclasses.
*/
AbstractStringBuilder() {
}
/**
* Creates an AbstractStringBuilder of the specified capacity.
*/
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
AbstractStringBuilder提供两个构造方法,一个是无参构造方法。一个是传一个capacity(代表数组容量)的构造,这个构造方法用于指定类中value数组的初始大小,数组大小后面还可动态改变。
四、普通方法
AbstractStringBuilder中的方法可大致分为五类:对属性的控制,对Value中char值的增删改查。
4.1、属性控制
主要是对Value的长度与容量进行的操作
1.length():
返回已经存储的实际长度(就是count值)
代码语言:javascript复制public int length() {
return count;
}
2.capacity():
capacity这个单词是’容量’的意思,返回当前value可以存储的字符容量,即在下一次重新申请内存之前能存储字符序列的长度。
代码语言:javascript复制 public int capacity() {
return value.length;
}
3.ensureCapacity(int minimumCapacity):
确保value数组的容量是否够用,如果不够用,调用4.expandCapacity(minimumCapacity)方法扩容,参数为需要的容量
代码语言:javascript复制 public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > 0)
ensureCapacityInternal(minimumCapacity);
}
4.expandCapacity(int minimumCapacity):
对数组进行扩容,参数为需要的容量
代码语言:javascript复制 void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}
扩容的算法:
如果调用了该函数,说明容量不够用了,先将当前容量 1的二倍(newCapacity)与需要的容量(minimumCapacity)比较。 如果比需要的容量大,那就将容量扩大到容量 1的二倍;如果比需要的容量小,那就直接扩大到需要的容量。 使用Arrays.copyOf()这个非常熟悉的方法来使数组容量动态扩大
5.trimToSize():
如果value数组的容量有多余的,那么就把多余的全部都释放掉
代码语言:javascript复制public void trimToSize() {
if (count < value.length) {
value = Arrays.copyOf(value, count);
}
}
6.setLength(int newLength):
强制增大实际长度count的大小,如果 newLength 参数小于当前长度则长度将更改为指定的长度, 截断,数据不变;如果 newLength 参数大于或等于当前长度则将追加有效的 null 字符 (’u0000’),使长度满足 newLength 参数
代码语言:javascript复制 public void setLength(int newLength) {
if (newLength < 0)
throw new StringIndexOutOfBoundsException(newLength);
if (newLength > value.length)
expandCapacity(newLength);
if (count < newLength) {
for (; count < newLength; count )
value[count] = '