• 拼接字符串的效率问题(String,StringBuffer,StringBuilder对比)


    拼接字符串,大致有3个class可以用,他们是String, StringBuffer ,StringBuilder。
    其中 StringBuilder是1.5中来代替StringBuffer的。

    检验各自拼接效率的代码如下:

    [java]
    public class test {   
    
    /**  
    * @param args  
    */   
    public static void main(String[] args) {   
    // TODO Auto-generated method stub   
            long n = 30000;  
            System.out.println("Start... "+n);    
    
            long start1 = System.currentTimeMillis();     
            String s1 = new String("hello");     
            for (long i = 0; i < n; i++)     
            {     
                s1+="拼接字符串的时间";     
            }     
            long end1 = System.currentTimeMillis();     
            long time1 = end1 -start1;     
            System.out.println("用String+=拼接字符串的时间"+time1);     
    
            long start2 = System.currentTimeMillis();     
            String s2 = new String("hello");     
            for (long i = 0; i < n; i++)     
            {     
                s2=s2+"拼接字符串的时间";     
            }     
            long end2 = System.currentTimeMillis();     
            long time2 = end2 -start2;     
            System.out.println("用String=String+拼接字符串的时间"+time2);   
    
            long start3 = System.currentTimeMillis();     
            String s3 = new String("hello");     
            for (long i = 0; i < n; i++)     
            {     
                s3=s3.concat("拼接字符串的时间");     
            }     
            long end3 = System.currentTimeMillis();     
            long time3 = end3 -start3;     
            System.out.println("用String.concat拼接字符串的时间"+time3);   
    
            long start4 = System.currentTimeMillis();     
            StringBuffer s4 = new StringBuffer("hello");     
            for (long i = 0; i < n; i++)     
            {     
                s4.append("拼接字符串的时间");     
            }     
            long end4 = System.currentTimeMillis();     
            long time4 = end4 -start4;     
            System.out.println("用StringBuffer.append拼接字符串的时间"+time4);     
    
            long start5 = System.currentTimeMillis();     
            StringBuilder s5 = new StringBuilder("hello");     
            for (long i = 0; i < n; i++)     
            {     
                s5.append("拼接字符串的时间");     
            }     
            long end5 = System.currentTimeMillis();     
            long time5 = end5 -start5;     
            System.out.println("用StringBuilder.append拼接字符串的时间"+time5);     
    
            System.out.println("End...");    
    }   
    
    }   

    检测数据如下(不考虑机器性能差异):

    Start… 30000
    用String+=拼接字符串的时间27468
    用String=String+拼接字符串的时间25813
    用String.concat拼接字符串的时间12265
    用StringBuffer.append拼接字符串的时间14
    用StringBuilder.append拼接字符串的时间8
    End…

    总结:


    1、String类本身是final类型,字符串拼接时,会使用StringBuffer,并调用append,之后再调用toString方法。
      而StringBuffer转换成String时,开销相当大。中间不仅创立了临时对象StringBuffer,还每次完后再要转成String。


    2、在做字符串连接时,String类的concat方法优于+号。 ( String += ) 与 ( String = String + ) 相率相当。


    3、而 StringBuilder的出现就是用来替换StringBuffer的,单线程情况下效率高于StringBuffer,但不适宜于多线程编程
    从这点上来说,StringBuilder 在单线程编程情况下应优先于StringBuffer使用。

    而在多线程编程时则应使用StringBuffer,不宜使用StringBuilder,因为StringBuffer是线程安全的 。


    4、单线程情况下做字符串连接,StringBuilder.append 与 StringBuffer.append 效率相当。

  • 相关阅读:
    spring框架基本操作
    HTML 小练习(静态网页)
    sqldeveloper 连接oracle失败报12514(日常错误)
    基于docker容器搭建fastdfs分布式文件系统
    centos7 64位系统jdbc连接oracle报错问题
    openstack kolla多节点容器化环境安装
    Android TabHost设置setCurrentTab(index),当index!=0时,默认加载第一个tab问题解决方法。
    maven导入dom4j以及jaxen.jar报java.lang.UnsupportedOperationException:错误
    android自学笔记(1):android简介
    Linux命令(7):rm命令
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932896.html
Copyright © 2020-2023  润新知