先来个实际对比,同样加"hello" 3000次,可以看出时间差距很大
String方法
String是用的也是StringBuilder,每次加新的String的时候就用一个新的array,全部拷贝进去。可以反编译class文件看出来。
public class test {
public static void main(String[] args) {
String a = "ab";
a += "c";
}
}
StringBuilder方法
单独用StringBuilder不同之处在于,扩容时会array会扩到接近原来两倍,所以之后再加字符串时免去扩容。
private int newCapacity(int minCapacity) {
// overflow-conscious code
// 这里扩容为原来两倍
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}