字符串拼接、效率對比

字符串拼接,大多數時候都是直接選擇+這種簡單、暴力的方式,如果數據量感覺不到對性能影響有多大,實際在不同的場景,選擇不同的拼接方式,還是很有必要的,而且+這種方式看着就很Low,是不是?

下面對幾種字符串拼接做下對比:


第一種:+ 拼接int

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str + i;
}
long endTime = new Date().getTime();
System.out.println("採用+號拼接整數耗時:" + (endTime - startTime));

採用+號拼接整數耗時:9479    原因:需要把i先轉成int 再轉成Integter,再通過toString強轉,然後採用StringBuilder拼接,會創建大量的StringBuilder對象

第二種:+拼接String
 

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str + “條”;
}
long endTime = new Date().getTime();
System.out.println("採用+號拼接字符串耗時:" + (endTime - startTime));

採用+號拼接字符串耗時:5063  和第一種相比,減去了i先轉成int 再轉成Integter,再通過toString強轉,所以時間消耗少了很多

第三種:concat
 

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str.concat(String.valueOf(i));
}
long endTime = new Date().getTime();
System.out.println("採用concat號拼接耗時:" + (endTime - startTime));

採用concat號拼接耗時:4010 ,內部會採用char數組的方式進行組合,然後通過new String重新構建,源碼如下:

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

第四種:StringBuilder

String str = "拼接第";
StringBuilder stringBuilder = new StringBuilder();
long startTime = new Date().getTime();
for (int i = 0; i < 5000000; i++) {
    stringBuilder.append(i);
}
str = str + stringBuilder;
long endTime = new Date().getTime();
System.out.println("採用StringBuilder拼接耗時:" + (endTime - startTime));


採用StringBuilder號拼接耗時:535

 

第五中:StringBuffer

String str = "拼接第";
StringBuffer stringBuffer = new StringBuffer();
long startTime = new Date().getTime();
for (int i = 0; i < 5000000; i++) {
    stringBuffer.append(i);
}
str = str + stringBuffer;
long endTime = new Date().getTime();
System.out.println("採用StringBuffer拼接耗時:" + (endTime - startTime));

採用StringBuffer號拼接耗時:735

對比StringBuffer、StringBuilder

StringBuilder和StringBuffer在次數同爲1萬次的時候,兩者差別不大,一旦擴充到幾百萬甚至幾千萬,那麼StringBuilder明顯比StringBuffer快了不少
經查看StringBuffer裏面的append多了一個synchronized(同步)修飾符,所以,耗時長一點。也就是說StringBuffer在保證線程安全的情況下效率被降低了

所以,各位可以根絕不同的場景選擇不同的拼接字符串的方式~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章