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+=拼接字符串的時間3411
用String=String+拼接字符串的時間3358
用String.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