String, StringBuffer和StringBuilder

在Java中,String是不可變類型,因此對於字符串的操做提供了兩個輔助類:StringBuffer和StringBuilder。java

這個兩個類的主要區別在於:安全

  • StringBuilder的效率更高
  • StringBuffer是線程安全的,而StringBuilder不是

不過,須要注意的是,在利用+對String對象直接進行拼接的時候,Java內部其實仍是用StringBuilder來實現的,可是和顯式地調用StringBuilder略有區別。app

考慮以下代碼:ui

javaString[] strings = new String[]{"one", "two", "three", "four", "five"};
String resultStr = "";
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
    resultStr += strings[i];
}
for (int i = 0; i < strings.length; i++) {
    resultBuilder.append(strings[i]);
}

在利用+直接進行拼接時,每次循環都會生成一個新的StringBuilder對象,也就是說等同:線程

javaStringBuilder stringBuilder = new StringBuilder(resultStr);
stringBuilder.append(strings[i]);
resultStr = stringBuilder.toString();

這樣運行的效率明顯是低於顯式調用StringBuilder的。code

可是在有一種狀況下,利用+拼接的速度會遠遠快於用StringBuilder或者StringBuffer,考慮以下代碼:對象

javaString str = "one" + "two" + "three";
StringBuilder strBuilder = new StringBuilder().append("one").append("two").append("three");

在這種狀況下,JVM會直接把String str = "one" + "two" + "three";理解爲String str = "onetwothree」;,也就說不須要像一般狀況下生成StringBuilder對象而後再拼接,速度天然快不少。不過須要強調的一點是,固然字符串來自其餘對象的時候,JVM不會作這種特殊處理,也就說以下代碼:three

javaString one = "one";
String two = "two";
String three = "three";
String str = one + two + three;

效率仍然是很是低的。字符串

相關文章
相關標籤/搜索