最近在做项目开发时,发现原有的一些项目存在大量用加号连接字符串的现象,小数据这样做没什么问题,但发现有用URL请求远程的另一个系统返回的字符流也用+=来把返回的数据连接起来,且还做成了公用方法,很多地方调用它,我们的用户也常有抱怨我们的项目很多功能很慢!于是为了说服同事,写了以下一个测试方法,看看用加号连接字符串到底与其它的常用连接方式有差多少,我用了四种方法做对比:
1.加号连接,如: str+="abcd";
2.用String的concat方法: str=str.concat("abcd");
3.用StringBuffer的append:StringBuffer stb=new StringBuffer(); stb.append(str).append("abcd");
4用StringBuilder的append: StringBuilder stb = new StringBuilder(); stb.append(str).append("abcd");
方式说清楚了,以下就是连接一个大字符串的测试类,看看各方式的速度如何:
package testProject;
public class StringConcat {
public void testConcat(){
//用于循环产生数字的次数
int num=100000;
//用于重复连接的字符串
String str="ab";
//1. --------用加号来连接字符串-------------------
//记录开始 运行这毫秒数
long startMills =System.currentTimeMillis();
//结果字条串
String resultStr="";
for(int i=0;i<num;i++){
resultStr+=str;
}
//得出用加号连接字符串的毫秒数
long firstMills = System.currentTimeMillis()-startMills;
//2.--------用string.concat()连接字符串------------
startMills =System.currentTimeMillis();
//结果字条串
resultStr="";
for(int i=0;i<num;i++){
resultStr=resultStr.concat(str);
}
//得出用string.concat()连接字符串的毫秒数
long secondMills = System.currentTimeMillis()-startMills;
//3.--------用StringBuffer.append()连接字符串------------
startMills =System.currentTimeMillis();
//结果字条串
StringBuffer stb=new StringBuffer();
for(int i=0;i<num;i++){
stb.append(str);
}
resultStr=stb.toString();
//得出用StringBuffer.append()连接字符串的毫秒数
long threeMills = System.currentTimeMillis()-startMills;
//4.--------用StringBuilder.append()连接字符串------------
startMills =System.currentTimeMillis();
//结果字条串
StringBuilder stbd=new StringBuilder();
for(int i=0;i<num;i++){
stbd.append(str);
}
resultStr=stbd.toString();
//得出用StringBuilder.append()连接字符串的毫秒数
long fourMills = System.currentTimeMillis()-startMills;
System.out.println("加号连接:"+firstMills);
System.out.println("String.concat():"+secondMills);
System.out.println("StringBuffer.append():"+threeMills);
System.out.println("StringBuilder.append():"+fourMills);
}
public static void main(String[] args) {
StringConcat sc=new StringConcat();
sc.testConcat();
}
}
当num=10000时,运行结果:
加号连接:196
String.concat():104
StringBuffer.append():1
StringBuilder.append():1
当num=100000时,运行结果:
加号连接:13712
String.concat():5038
StringBuffer.append():9
StringBuilder.append():7
-----------------------------------------------
结果惊人,所以,在有大数据需要连接时,优先选择StringBuilder.append.