结论:StringBuilder > StringBuffer > concat > "+"  原因如下:

1.使用"+"拼接:

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

首先来看这段代码干了什么事,通过javap得出步骤如下:

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

我们需要了解的是,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拼接字符串

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

首先我们再来看一下这段代码干了什么?

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

此时我们轻易可知,str = str.concat("A") 干了什么事

1.str.concat("A")生成了一个新字符串

2.将该字符串赋值给了str

也就是说,每执行一次str = str.concat("A") , 便会在字符串常量池中增加一个字符串(A, AA, AAA...)

 

3.使用StringBuilder拼接字符串

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

首先我们来看一下这段代码做了什么事?

java使用“+“,concat和StringBuilder、StringBuffer拼接字符串性能对比

由上图可知,至始至终都只有1个StringBuilder对象,并且没有一直向字符串常量池中添加字符串,只有当执行toString方法后,才会将添加进字符串常量池。

 

4.使用StringBuffer拼接

StringBuffer只是在公开方法加了synchronized获取排他锁,保证线程同步,其他实现和StringBuilder差不太多,性能相较StringBuilder也低一些

 

 

 

 

 

相关文章:

  • 2021-07-06
  • 2022-12-23
  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
  • 2021-05-13
  • 2022-12-23
猜你喜欢
  • 2021-11-27
  • 2021-07-31
  • 2022-12-23
  • 2022-03-02
  • 2021-10-25
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案