从头开始学JDK-------StringBuilder
目录
* StringBuilder #append(String)
* StringBuilder #可变原因
StringBuilder是一个可变的字符串,内部与String一样,维护的是一个char[] value数组。初始容量为16。
public StringBuilder() {
int capacity = 16;
value = new char[capacity];
}
* StringBuilder #扩容机制
每次添加新的元素之前,要判断内部的char[] value数组是否能够支持够用。如果不够用,需要扩容。
每次扩容大小:【 2倍原大小 + 2 】。默认char[] value 长度为16。
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
value = Arrays.copyOf(value, newCapacity);
}
* 衍生 ArrayList初始化容量与扩容
无参的ArrayList起初是一个空数组,在第一次添加元素10个以下元素的时候容量修改成10。
ArrayList每次扩容成上次的1.5倍。实现原理一样,使用Arrays.copyOf(value,newCapacity)
* StringBuilder #append(String)
链式调用经典案例。方法返回this
public StringBuilder append(String str) ...
if (str == null} {
return append("null");
}
int len = str.length();
ensureCapacityInternal(count + len);
//把str从0到结尾,添加到char[] value中,从value的第count位(末尾)处开始
str.getChars(0, len, value, count);
count += len;
return this;
* StringBuilder #toString
toString()方法重新把内部的char[] value数组,通过String的构造函数,重新创建一个字符串对象。
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
* 衍生 StringBuffer # toString
StringBuffer与StringBuilder有是否加锁的区别
StringBuffer增加了缓冲区。每次toString的时候都会使用缓冲区的toStringCache来构造字符串。
StringBuffer在每次改变内部char[] value数组之前,都会清除toStringCache缓存。
class StringBuffer ...
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
public synchronized String append(String str) {
toStringCache = null;
super.append(str);
return this;
}