在循环体内拼接字符串时为什么使用StringBuilder而不是String
在《阿里巴巴Java开发手册》一书中提到了:
循环体内,字符串的连接方式,请使用 StringBuilder 的 append 方法进行扩展。(而不要用+String的方式)
说明:因为反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行
append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。
如何更直观的理解这句话呢?
我们使用for循环100000次来拼接一个字符串,并打印这段的运行时间,单位(ms)
public static void main(String[] args) {long startTime = System.currentTimeMillis();String str = "";for (int i = 0; i < 100000; i++) {str += i;}System.out.println(str);long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);
}
我们可以看到,整整跑了两秒多。
同样的逻辑,我们接下来使用StringBuilder 的append()进行拼接来跑一遍
public static void main(String[] args) {long startTime = System.currentTimeMillis();StringBuilder str = new StringBuilder();for (int i = 0; i < 100000; i++) {str.append(i);}System.out.println(str);long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);
}
我们发现使用StringBuilder进行拼接只用了11毫秒就执行完了。速度是 + String 的 两百多倍,极大的优化了执行效率。
因此,在循环中拼接字符串的大部分场景下我们最好的选择一定是后者。