String:是连续的内存空间,每天连接都需要重新new对象,很好堆内存。
StringBuffer:是动态变化的,内存空间不连续,而且是线程安全的。append方法里同步的修饰
StringBuild:是动态变化的,内存空间也是不连续的,但是是线程不安全的,append方法没有同步修饰。
StringBuffer、StringBuild初始大小=初始值长度+16
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
每次追加前先判断容量够不够,不够就去扩容
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;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}