概述
在日常擼碼中,經常會有字符串的合併,如果數據小還好,如果數據大的話,就會涉及到一個效率的問題。我們經常使用String,但是,實際上還有StringBuffer、StringBuilder。我們來驗證一下它們的效率。累加字符串10000次,比較它們所用的時間。
String
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3;
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str1 = str1 + "123123123";
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
運行時間爲:time:359
StringBuffer
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3;
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str2.append("123123123");
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
運行時間爲:time:0
我們把次數加大到100000次
運行時間爲:time:16
StringBuilder
同樣我們把次數加大到100000次
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3 = new StringBuilder();
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str3.append("123123123");
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
運行時間爲:time:0
我們再次把次數加大到100000次
運行時間爲:time:31
總結
由上面的數據可以看出,拼接字符串的效率是:
String < StringBuffer < StringBuilder
在API文檔中,StringBuffer的介紹是:
線程安全的可變字符序列。
StringBuilder的介紹是:
一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比 StringBuffer 要快。StringBuilder 的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用 StringBuffer。