• 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

  • 相关阅读:
    springboot + 自定义配置文件读取
    springboot + mybatis分页插件pagehelper
    Python学习日记(三十九) Mysql数据库篇 七
    Python学习日记(三十八) Mysql数据库篇 六
    Python学习日记(三十七) Mysql数据库篇 五
    Python学习日记(三十六) Mysql数据库篇 四
    Python学习日记(三十五) Mysql数据库篇 三
    Python学习日记(三十四) Mysql数据库篇 二
    Python学习日记(三十三) Mysql数据库篇 一
    Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
  • 原文地址:https://www.cnblogs.com/interdrp/p/1831726.html
Copyright © 2020-2023  润新知