• 拼接字符串的效率问题(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 效率相当。

  • 相关阅读:
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Pythonlog() 函数
    Rabbitmq+sockjs+stomp.js前端的使用
    alter table t_user alter column create_date set default CURRENT_TIMESTAMP; 报错(idea生成的sql)
    eldatepicker日期控件日期少一天
    实际开发中String转换为json串作为入参发生"JSON parse error:Cannot deserialize value of type Date......not a valid解决
    Cannot deserialize value of type `java.util.Date` from String
    ProtoBuf试用与JSON的比较
    TCP粘包/拆包问题
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932896.html
Copyright © 2020-2023  润新知