前言
之前在看到一篇文章,说到for循环里拼接字符串最好用StringBuilder,而不是String+=“”,联想到读过的《阿里巴巴Java开发手册》也有类似的说辞。但那是看了之后没再深究,所以借这篇文章深入分析一下为什么for循环里拼接字符串为什么最好用StringBuilder?
举例
平时写代码的时候,我们经常会遇到在一个循环里去拼接字符串,为了追求效率,很多人会直接写上如下的代码:
public static void main(String[] args) {
String s= "" ;
for(int i=1;i<10;i++){
s+=i;
}
System.out.println(s);
}
分析
根据《阿里巴巴开发手册》里的说法,这种写法一般会引起空间浪费问题。下面仔细说下为什么会引起这类问题。
- 使用字节码工具在cmd里执行
javac Test.java
javap -c Test.class
可以大概看出在11行的时候new了一个java.lang.StringBuilder的对象,其他就是一些操作数栈到变量,变量到操作数栈的赋值过程。想要看懂相应字节码代表的意思,可以参考文章:
Java生成字节码的意思
如果还不够直观,可以看下面的方式。
- 使用jad工具反编译代码
这里就可以更明显地看出其实每次循环的时候都会去new一个StringBuilder对象,然后再toString,最后赋值给s。
总结
- 在单线程少并发的情况下,尽量用StringBuilder代替简单粗暴的+=,减少新生成对象的空间浪费。
- +=实际上是java语言提供给String类型的语法糖,其实现原理是使用StringBuilder.append。