AbstractStringBuilder类
背景:是StringBuffer和StringBuilder 的父类,本章将介绍AbstractStringBuilder的字符串拼接过程
- 基本的属性
/**
* 储存字符串的char数组,默认初始化大小为16
*/
char[] value;
/**
* 上面value数组中已使用过的长度
*/
int count;
- 重点方法 append
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
//value数组扩容的方法
ensureCapacityInternal(count + len);
//将str字符串转化为char数组并合到value中
str.getChars(0, len, value, count);
count += len;
return this;
}
ensureCapacityInternal方法扩容的实现过程为:
比较是否需要扩容 -> 扩容为value原本长度的2倍+2 -> 比较是否满足扩容需求 -> 不满足则将扩容为本次str长度加count长度
private void ensureCapacityInternal(int minimumCapacity) {
// value原本的长度是否大于 本次str字符串长度加上count已使用的长度
if (minimumCapacity - value.length > 0) {
//不大于则对value数组进行扩容
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
//获取扩容的大小
private int newCapacity(int minCapacity) {
// 将value扩容至原容量的2倍+2;
int newCapacity = (value.length << 1) + 2;
//比较value扩容后的大小是否满足
if (newCapacity - minCapacity < 0) {
//还不满足则直接把本次需要的最大容量作为本次扩容容量
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
总结:对于字符串的拼接,AbstractStringBuilder都是基于堆内存操作的,相比于string的直接拼接,这样会节省更多的空间。