java最高精度的时间差测试String,StringBuffer,StringBuilder拼接字符串效率问题

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...
**/

最后得出一些结论:

  1. 无论操作字符串次数多少,StringBuilder()都值得我们去优先选择!因为效率确实高!
  2. 当对字符串拼接中,操作是在个位数或者十来次操作的时候,使用StringBuilder.append(),效率最高其次是String.concat>String=String+String>,剩下的不太好说,但是string的效率确实在操作不多的情况下比StringBuffer()优秀!
  3. 当操作数量上来的时候,StringBuffer()、StringBuilder跟string的各种操作的耗时就越来越明显了。

最后,大家可以自己在本地测测,如有出入,请见谅!

猜你喜欢

转载自blog.csdn.net/chengderong123/article/details/81000046