测试代码
public class TestString {
public static void main(String[] args) {
long start = System.currentTimeMillis();
testString();
System.out.println("String 耗时:"+ (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
testStringBuffer();
System.out.println("StringBuffer 耗时:"+ (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
testStringBuilder();
System.out.println("StringBuilder 耗时:"+ (System.currentTimeMillis() - start) + "ms");
}
public static String testString(){
String result = "";
for (int i = 10000; i< 20000; i++) {
result += "AA" + i + "BB";
}
return result;
}
public static String testStringBuffer(){
StringBuffer result = new StringBuffer();
for (int i = 20000; i< 30000; i++) {
result.append("CC").append(i).append("DD") ;
}
return result.toString();
}
public static String testStringBuilder(){
StringBuilder result = new StringBuilder();
for (int i = 30000; i< 40000; i++) {
result.append("EE").append(i).append("FF") ;
}
return result.toString();
}
}复制代码
测试结果
String 耗时:566ms
StringBuffer 耗时:7ms
StringBuilder 耗时:3ms
问题分析
String
result += "AA" + i + "BB";
这句代码经过编译后其实是变成
result.append(new StringBuffer("AA") )
.append(new StringBuffer(i))
.append( new StringBuffer("BB"))
看编译后的文件
每次循环里面都需要new StringBuffer后再拼接,因为new对象是非常耗费时间的,所以慢就慢在这里。
StringBuilder与 StringBuffer比较
StringBuilder:线程非安全的
StringBuffer:线程安全的
所以StringBuilder的稍微比StringBuffer快那么一点是很合理的
总结
1.如果要操作少量的数据用String
2.单线程操作字符串缓冲区下操作大量数据用StringBuilder可以获得最佳性能
3.多线程操作字符串缓冲区下操作大量数据建议使用StringBuffer