java最高精度的时间差System.nanoTime()测试String,StringBuffer,StringBuilder拼接字符串的效率问题
在测试String,StringBuffer,StringBuilder之间的效率时,如果用System.currentTimeMillis()的前后时间差来比较的话,如果操作字符数量较少(数以十次)的话,是根本比较不了他们的差别的,只有当数量达到万级别的操作字符串,才能有明显的差别。所以今天我要用System.nanoTime()来测!
/*
--------------System.nanoTime()的简单介绍-----------------
System.nanoTime函数,该函数是返回纳秒的。1毫秒=1纳秒*1000*1000
系统中如果需要计算时间差的,那种很小很小的,可以通过System的nanoTime函数来计算时间差。
而System.currentTimeMillis()精确度只有毫秒!
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long n = 2;
System.out.println("Start... " + n);
long start1 = System.nanoTime();
String s1 = new String("hello");
for (long i = 0; i < n; i++) {
s1 += "拼接字符串的时间";
}
long end1 = System.nanoTime();
long time1 = end1 - start1;
System.out.println("用String+=拼接字符串的时间" + time1);
long start2 = System.nanoTime();
String s2 = new String("hello");
for (long i = 0; i < n; i++) {
s2 = s2 + "拼接字符串的时间";
}
long end2 = System.nanoTime();
long time2 = end2 - start2;
System.out.println("用String=String+拼接字符串的时间" + time2);
long start3 = System.nanoTime();
String s3 = new String("hello");
for (long i = 0; i < n; i++) {
s3 = s3.concat("拼接字符串的时间");
}
long end3 = System.nanoTime();
long time3 = end3 - start3;
System.out.println("用String.concat拼接字符串的时间" + time3);
long start4 = System.nanoTime();
StringBuffer s4 = new StringBuffer("hello");
for (long i = 0; i < n; i++) {
s4.append("拼接字符串的时间");
}
long end4 = System.nanoTime();
long time4 = end4 - start4;
System.out.println("用StringBuffer.append拼接字符串的时间" + time4);
long start5 = System.nanoTime();
StringBuilder s5 = new StringBuilder("hello");
for (long i = 0; i < n; i++) {
s5.append("拼接字符串的时间");
}
long end5 = System.nanoTime();
long time5 = end5 - start5;
System.out.println("用StringBuilder.append拼接字符串的时间" + time5);
System.out.println("End...");
}
}
输出结果
------------------------------------------------------------------------------------------
Start... 2
用String+=拼接字符串的时间12461
用String=String+拼接字符串的时间15103
用String.concat拼接字符串的时间4909
用StringBuffer.append拼接字符串的时间27564
用StringBuilder.append拼接字符串的时间1132
可见,使用System.nanoTime()来测试时间消耗可以测试字符串个位数的操作!
如果把n的制调到10输出结果为
/**
Start... 10
用String+=拼接字符串的时间16991
用String=String+拼接字符串的时间7929
用String.concat拼接字符串的时间7174
用StringBuffer.append拼接字符串的时间28696
用StringBuilder.append拼接字符串的时间2266
End...
**/
把n值调到1000
/**
Start... 100
用String+=拼接字符串的时间114407
用String=String+拼接字符串的时间183882
用String.concat拼接字符串的时间255623
用StringBuffer.append拼接字符串的时间54372
用StringBuilder.append拼接字符串的时间8307
End...
**/
最后得出一些结论:
- 无论操作字符串次数多少,StringBuilder()都值得我们去优先选择!因为效率确实高!
- 当对字符串拼接中,操作是在个位数或者十来次操作的时候,使用StringBuilder.append(),效率最高其次是String.concat>String=String+String>,剩下的不太好说,但是string的效率确实在操作不多的情况下比StringBuffer()优秀!
- 当操作数量上来的时候,StringBuffer()、StringBuilder跟string的各种操作的耗时就越来越明显了。
最后,大家可以自己在本地测测,如有出入,请见谅!