Java字符串拼接效率和String,StringBuilder,StringBuffer三者的区别

Java字符串拼接效率和String,StringBuilder,StringBuffer三者的区别

拼接字符串,用String, StringBuffer,StringBuilder。StringBuilder是jdk1.5中新增的。


测试类如下:

public class TestStringConcat {
    public static void main(String[] args) {
        long n = 30000; 
        System.out.println("Starting... ");  
        //String+=拼接
        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); 

        //String=String+拼接
        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);  

        //用String.concat拼接
        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);  

        //用StringBuffer.append拼接
        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);    

        //用StringBuilder.append拼接
        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...");   
    }
}

结果:

Starting...String+=拼接字符串的时间3411String=String+拼接字符串的时间3358String.concat拼接字符串的时间1671
用StringBuffer.append拼接字符串的时间6
用StringBuilder.append拼接字符串的时间2
End...

总结

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String;
String最慢的原因:
  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

2.在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的;
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

3.使用条件:
String:适用于少量的字符串操作的情况。
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。
  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

文章摘自:https://www.cnblogs.com/su-feng/p/6659064.html
https://www.cnblogs.com/Faith-zhang/p/6374834.html

展开阅读全文

没有更多推荐了,返回首页