Java解惑之String的"+"一定差于StringBuilder的append吗?(转载)

 一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用+来串联字符串以达到附加新字符或字符串的目的,但+会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用+来进行字符串的串联。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。   
J2SE   5.0提供java.lang.StringBuilder类,使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。
但是,String的"+"一定差于StringBuilder的append吗?
 
  

1)代码:

Java代码   收藏代码
  1. public static String s1() {  
  2.     String result = "";  
  3.   
  4.     result += "A";  
  5.     result += "B";  
  6.     result += "C";  
  7.   
  8.     return result;  
  9. }  
  10.   
  11. public static String s2() {  
  12.     String result = "";  
  13.     result = "A" + "B" + "C";  
  14.   
  15.     return result;  
  16. }  
  17.   
  18. public static String s3() {  
  19.     StringBuilder result = new StringBuilder();  
  20.     result.append("A").append("B").append("C");  
  21.     return result.toString();  
  22. }  

 

2)结论:性能上s2 > s3 > s1

3)分析:

Javap查看字节码:

 

由上图可知:

s1方法:3次创建StringBuilder对象,6次调用append方法添加字符串,3次调用toString方法把添加后的结果返回给result,三者之中,性能最差。

s2方法:编译器对“+”进行优化,合并"A"+"B"+"C"为“ABC”,直接赋给result,三者之中,性能最好。

s3方法:1次创建StringBuilder对象,3次调用append方法添加字符串,1次调用toString方法把添加后的结果返回给result,三者之中,性能居中。

 

4)总结:

  • 在做字符串的连接操作时,append方法未必是最好的。
  • 等号右侧有变量参与的字符串“+”操作(例如:result += "A"),jvm在做连接时,是创建一个新的StringBuilder对象,然后使用其append方法来实现连接,等号右侧没有变量参与的字符串“+”操作(例如:result = "A" + "B" + "C"),jvm在做连接时,会对右侧的连接操作进行优化,将其合并成一个字符串,然后赋给左边的变量,此时就变成了一次简单的赋值过程。

 

5)补充

5.1)代码:

Java代码   收藏代码
  1. public static String s4() {  
  2.     String result = "";  
  3.     result = result + "A" + "D";  
  4.   
  5.     return result;  
  6. }  
  7.       
  8. public static String s5() {  
  9.     String result = "";  
  10.     result += "A" + "D";  
  11.   
  12.     return result;  
  13. }  

 

5.2)分析:

Javap查看字节码: 

 

由上图可知:

s4方法:1次创建StringBuilder对象,3次调用append方法添加字符串(A和D各占一次),1次调用toString方法把添加后的结果返回给result。

s5方法:1次创建StringBuilder对象,2次调用append方法添加字符串(A和D经优化变成AD,所以A和D加起来仅占一次),1次调用toString方法把添加后的结果返回给result。

 

5.3)总结:

  • s4和s5中等号右侧都有变量参于进行字符串的“+”操作(result),所以都会创建StringBuilder对象,并使用其append方法实现连接。
  • s4中使用的是“=”,所以等号右侧显式的指出了result变量参与字符串的“+”操作,在这种情况下,A和D分两次append完成,而s5中使用的是“+=”,所以等号右侧隐式的指出了result变量参与字符串的“+”操作,在这种情况下,A、D合并成AD,一次append完成。

你可能感兴趣的:(Java解惑之String的"+"一定差于StringBuilder的append吗?(转载))