前言

有很多时候,会有大量的字符串的拼接操作,但是我们很多coder,尤其是刚入职场的年轻coder,使用的方式可能就是String str +=s;而且我翻我自己所参与的项目里面的以前很久的代码也有大量的这种写法,但是很少有人知道,这种写法在操作基数很大的时候效率还是很低下的。talk is cheep,show me the code,少说废话,先上代码吧。

测试场景一

当字符串拼接操作次数在1000的级别时,效率差异不是很大的。


public class TestClient {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub

testString();
}
private static void testString()throws Exception{


///1.str+=s的方式。
String str= "";
String s ="a";
long start = System.currentTimeMillis();

for(int i=0; i < 1000;i++){
str+=s;
}

long end = System.currentTimeMillis();
System.out.println("String+=s耗时:"+(end-start)+"ms");

///2.String.concat()方式
long start1 = System.currentTimeMillis();
String str1= "";
for(int i=0; i < 1000;i++){
str1.concat(s);
}

long end1 = System.currentTimeMillis();

System.out.println("String.concat()耗时:"+(end1-start1)+"ms");

///3.StringBuffer.append()方式

long start2 = System.currentTimeMillis();
StringBuffer str2= new StringBuffer();
for(int i=0; i < 1000;i++){
str2.append(s);
}

long end2 = System.currentTimeMillis();
System.out.println("StringBuffer.append()耗时:"+(end2-start2)+"ms");


4.StringBuilder.append()方式
long start3 = System.currentTimeMillis();
StringBuilder str3= new StringBuilder();
for(int i=0; i < 1000;i++){
str3.append(s);
}

long end3 = System.currentTimeMillis();
System.out.println("StringBuilder.append()耗时:"+(end3-start3) +"ms");

}

场景一运行结果

String+=s耗时:3ms
String.concat()耗时:0ms
StringBuffer.append()耗时:0ms
StringBuilder.append()耗时:0ms

测试场景二

当操作的次数上升到10000的时候有如何呢?

场景二运行结果

String+=s耗时:71ms
String.concat()耗时:1ms
StringBuffer.append()耗时:1ms
StringBuilder.append()耗时:1ms

测试场景三

当操作上升到100000的时候有如何呢?

String+=s耗时:13250ms
String.concat()耗时:7ms
StringBuffer.append()耗时:4ms
StringBuilder.append()耗时:3ms

结论

结果总是那么让人惊艳。很显然StringBuilder和StringBuffer的append()方式效率更高,String的concat()的方法效率也还可以的。那为什么String的+=s的操作方式效率会那么低呢?那是因为这种方式会不停的创建新的String对象,这样会浪费不少内存空间,而且效率也不高。所以我们一般处理少量操作的时候建议用String的concat()方法就可以了。遇到大量拼接操作的时候建议还是用StringBuffer,StringBuilder的append()的方法。