结论:StringBuilder > StringBuffer > concat > "+" 原因如下:
1.使用"+"拼接:
首先来看这段代码干了什么事,通过javap得出步骤如下:
我们需要了解的是,str += "A"到底做了什么事情?由上图可知
1. 创建StringBuilder对象
2.StringBuilder对象执行append(str)
3.StringBuilder对象执行append("A")
4.StringBuilder对象执行toString(),并将结果赋值给了str
结论:str += "A" 等同于 str = new StringBuilder().append(str).append("A").toString()
也就是说,每执行一次str += "A" ,堆内存中便会创建一个StringBuilder对象,并且常量池中增加一个字符串(A,AA,AAA,AAAA...)
2.使用concat拼接字符串
首先我们再来看一下这段代码干了什么?
此时我们轻易可知,str = str.concat("A") 干了什么事
1.str.concat("A")生成了一个新字符串
2.将该字符串赋值给了str
也就是说,每执行一次str = str.concat("A") , 便会在字符串常量池中增加一个字符串(A, AA, AAA...)
3.使用StringBuilder拼接字符串
首先我们来看一下这段代码做了什么事?
由上图可知,至始至终都只有1个StringBuilder对象,并且没有一直向字符串常量池中添加字符串,只有当执行toString方法后,才会将添加进字符串常量池。
4.使用StringBuffer拼接
StringBuffer只是在公开方法加了synchronized获取排他锁,保证线程同步,其他实现和StringBuilder差不太多,性能相较StringBuilder也低一些