热门文章 | 热门软件| 热门源码 | 热门电影 | 知识库 | 联系我们
软件 源码 教程 影视 健康 招聘
  HTML | JavaScript | ASP | PHP | JSP | NET | VB | VC | VF | Windows | Linux | Mysql | Mssql | Oracle | Struts 
当前位置: 创世纪计算机资源网 -> 文章频道 ->java 
站内搜索:
是String,StringBuffer还是StringBuilder ?(2)
作者:陈朋奕 谢仍明 来源:blog 整理日期:2007-10-30

    public void test(StringBuffer s){

        long begin = System.currentTimeMillis();

        for(int i=0;i<ttime;i++){

            s.append("add");

        }

        long over = System.currentTimeMillis();

        System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "

            + (over - begin) + " 毫秒 " );       

    }

    public void test(StringBuilder s){

        long begin = System.currentTimeMillis();

        for(int i=0;i<ttime;i++){

            s.append("add");

        }

        long over = System.currentTimeMillis();

        System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "

            + (over - begin) + " 毫秒 " );       

    }

    // 对 String 直接进行字符串拼接的测试

    public void test2(){

        String s2 = "abadf";

        long begin = System.currentTimeMillis();

        for(int i=0;i<ttime;i++){

            String s = s2 + s2 + s2 ;

        }

        long over = System.currentTimeMillis();

        System.out.println(" 操作字符串对象引用相加类型使用的时间为: "

            + (over - begin) + " 毫秒 " );       

    }

    public void test3(){

        long begin = System.currentTimeMillis();

        for(int i=0;i<ttime;i++){

            String s = "abadf" + "abadf" + "abadf" ;

        }

        long over = System.currentTimeMillis();

        System.out.println(" 操作字符串相加使用的时间为: "

            + (over - begin) + " 毫秒 " );       

    }

   

    public static void main(String[] args){

    String s1 ="abc";

    StringBuffer sb1 = new StringBuffer("abc");

    StringBuilder sb2 = new StringBuilder("abc");

    testssb t = new testssb();

    t.test(s1);

    t.test(sb1);

    t.test(sb2);

    t.test2();

    t.test3();

    }


 

以上代码在 NetBeans 5.0 IDE/JDK1.6 上编译通过

循环次数 ttime 为 10000 次的测试结果如下:

操作 java.lang.String 类型使用的时间为: 4392 毫秒

操作 java.lang.StringBuffer 类型使用的时间为: 0 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 0 毫秒

操作字符串对象引用相加类型使用的时间为: 15 毫秒

操作字符串相加使用的时间为: 0 毫秒 
 

好像还看不出 StringBuffer 和 StringBuilder 的区别,把 ttime 加到 30000 次看看:

操作 java.lang.String 类型使用的时间为: 53444 毫秒

操作 java.lang.StringBuffer 类型使用的时间为: 15 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 15 毫秒

操作字符串对象引用相加类型使用的时间为: 31 毫秒

操作字符串相加使用的时间为: 0 毫秒 
 

StringBuffer 和 StringBuilder 的性能上还是没有太大的差异,再加大到 100000 看看,这里就不加入对 String 类型的测试了,因为对 String 类型这么大数据量的测试会很慢滴……

操作 java.lang.StringBuffer 类型使用的时间为: 31 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 16 毫秒 
 

能看出差别了,但其中有多次的测试结果居然是 StringBuffer 比 StringBuilder 快,再加大一些到 1000000 看看(应该不会当机吧?):

操作 java.lang.StringBuffer 类型使用的时间为: 265 毫秒

操作 java.lang.StringBuilder 类型使用的时间为: 219 毫秒 
 

有些少区别了,而且结果很稳定,再大点看看, ttime = 5000000 :

······ Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ······

呵呵,算了,不去测试了,基本来说都是在性能上都是 StringBuilder > StringBuffer > String 的了。

其实这里测试并不是很公平,因为都放在了一起以先后顺序进行,测试方法中间没有考虑到JVM的GC收集前面产生的无引用对象垃圾而对执行过程的中断时间。如果大家有更好的想法或者思路欢迎跟讨论:chenpengyi#gmail.com。

 

[1]  [2]  
相关文章