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

原文地址:https://www.cnblogs.com/interdrp/p/1831726.html