欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-22 17:24:10
...

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