StringBuilder append()与String "+"运算符拼接的差异及效率对比
字符串拼接的实例创建与效率对比
先看两段代码:
代码片段1:显式使用StringBuilder
StringBuilder sb = new StringBuilder(""); for (int i = 0; i < 5; i++) { sb.append("hello "); } System.out.println(sb.toString());
代码片段2:使用"+="拼接字符串
String ss = ""; for (int i = 0; i < 5; i++) { ss += "hello "; } System.out.println(ss);
问题解答
1. 循环中执行ss += "hello "会创建新的String实例吗?
会的。虽然Java编译器对字符串+操作会优化为使用StringBuilder的append方法,但循环内的每次+=操作都是独立的优化单元:
- 每次迭代时,编译器会新建一个StringBuilder实例,将当前ss的内容和"hello "依次append进去
- 然后调用
toString()生成一个全新的String对象,再把这个对象赋值给ss变量 - 循环5次的话,会额外创建5个StringBuilder实例和5个新的String对象(初始的空字符串不算在内)
编译器无法将整个循环的拼接逻辑合并到一个StringBuilder实例中,因为编译期无法确定循环的执行次数。
2. 哪段代码效率更高?
第一段显式使用StringBuilder的代码效率更高,原因如下:
- 第一段全程只创建1个StringBuilder实例,循环中仅执行append操作(无额外对象创建),最后仅生成1个String对象
- 第二段每次循环都要创建新的StringBuilder和String对象,频繁的对象创建会带来额外的内存分配和垃圾回收开销,循环次数越多,这种性能差距越明显
内容的提问来源于stack exchange,提问作者MVKXXX
相关产品推荐
相关产品推荐

