zoukankan      html  css  js  c++  java
  • Java几种拼接字符串的效率问题

    代码
    public class StringTest   
    {   
        
    public static void main(String[] args)   
        {   
            
    long start = System.currentTimeMillis();   
            String s 
    = new String("hello");   
            
    for (int i = 0; i < 15000; i++)   
            {   
                s
    +=i;   
            }   
            
    long end = System.currentTimeMillis();   
            
    long time = end -start;   
            System.out.println(
    "用String +=拼接字符串的时间"+time);   
               
            
    long start1 = System.currentTimeMillis();   
            StringBuffer sb 
    = new StringBuffer("hello");   
            
    for (int i = 0; i < 15000; i++)   
            {   
                sb.append(i);   
            }   
            
    long end1 = System.currentTimeMillis();   
            
    long time1 = end1 -start1;   
            System.out.println(
    "用StringBuffer append拼接字符串的时间"+time1);   
               
            
    long start2 = System.currentTimeMillis();   
            StringBuilder builder 
    = new StringBuilder("hello");   
            
    for (int i = 0; i < 15000; i++)   
            {   
                builder.append(i);   
            }   
            
    long end2 = System.currentTimeMillis();   
            
    long time2 = end2 -start2;   
            System.out.println(
    "用StringBuilder append拼接字符串的时间"+time2);   
        }   
    }   
    打印结果:   
    用String 
    +=拼接字符串的时间3984  
    用StringBuffer append拼接字符串的时间31  
    用StringBuilder append拼接字符串的时间0  

    当然这个时间取决于你计算机的速度,不过可以看出,Buffer和Buildr相差无几,而String就慢许多了
    原因:
        查看程序的字节码,你就会明白了,原因是String类本身是final类型,他不能更改,所以拼接时,它会使用StringBuffer,并调用append,之后再调用toString方法,每次都要这样,StringBuffer再转换成String时,代价是很大的。这是它慢的主要的一些原因。不仅创立了临时对象StringBuffer,还每次完后再要转成String。
        而 StringBuilder的出现就是用来替换StringBuffer的,所以应该尽可能StringBuilder来拼接,将转为String的数量减至最少,降低对象的创建数,大大提高性能。

    接下来,讲StringBufferStringBuilder的使用场合。

      我们已知:StringBuffer是线程安全的,速度较慢的;而StringBuilder是不安全的,速度较快的。

      那么我们要分析一下,是保证线程安全,还是追求速度。

      我们在进行web项目开发时,通常会使用框架,那就要看看使用的框架是单线程的还是多线程的,如果框架是线程安全的,那我们就可以追求速度,使用StringBuilder即可。如果是不安全的,那最好使用StringBuffer

  • 相关阅读:
    分布式事务之最终一致性BASE理论
    CAP理论
    Comparator中返回0导致数据丢失的大坑
    电脑主板分类
    SimpleDateFormat线程不安全
    Redis面试题
    JS闭包
    ES6将两个数组合并成一个对象数组
    视频色彩空间RGB、YUV、YCbCr
    c#接口作用的深入理解
  • 原文地址:https://www.cnblogs.com/interdrp/p/1831726.html
Copyright © 2011-2022 走看看