原因:
若不使用 StringBuilder 的 append 方法而使用 + 来进行连接。那么每次在循环体内都将会在 Heap 中创造一个新的 String 对象,造成资源浪费。使用 StringBuilder 数据类型则能够有效避免浪费。对比 String 与 StirngBuilder 的源码。
源码:
String
private final char value[];
// 本质是字符数组常量,所以不可变
public String() {
this.value = "".value;
}
StringBuilder
public StringBuilder() {
// StringBuilder 类继承 AbstractStringBuilder 抽象类
// 创建长度 16 的字符数组
super(16);
}
// 字符串拼接
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
AbstractStringBuilder
// 没有 final 关键字修饰,字符数组长度可变
// 这也就是为什么 StringBuffer 与 StringBuilder 的数组可变的原因
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}