结论: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也低一些

本文对比了四种字符串拼接方式:使用+号、concat方法、StringBuilder和StringBuffer的性能。实验表明StringBuilder性能最优,其次是StringBuffer,再次是concat,性能最差的是使用+号。文章详细分析了每种方式的工作原理及其内存消耗。

1521





