1.string與StringBuilder的區別。
string對象是不可變的。包括長度或者其中的任何字元都是不可以改變的。
string @string = "a";
@string = @string + "b";
以上代碼讓人誤以為@string是能夠增加長度的。其實第二句代碼是重新建立了一個新的對象,而第一個對象被丟棄,它將成為垃圾收集器收集的對象。
C#中不能使用new string()來構造一個string對象。假如可以,以上代碼相當於:
string @string = new string("a");
@string = new string("a"+"b");
StringBuilder是可變的。它是專門用於對字串和字元執行動態操作的類。
用StringBuilder實現:
StringBuilder stringBuilder = new StringBuilder("a");
stringBuilder.Append("b");
StringBuilder在內部有一個足夠長的字元數組用於存放字串對象,當字串長度沒超過字元數組長度時,所有操作都是針對同一個字元數組。當長度超過時,StringBuilder將自動建立一個更長的數組,把原來的資料複製到新數組中。
2.字串操作效能比較。
讓string和StringBuilder執行相同的操作:迴圈追加一個字串"a"。
public static void CompareString()
...{
UseString();
UseStringBuilder();
}
private static void UseString()
...{
string @string = "";
DateTime startTime = DateTime.Now;
for (int i = 0; i < 10000; i++)
...{
@string += "a";
}
DateTime endTime = DateTime.Now;
TimeSpan timeSpan = endTime - startTime;
Console.WriteLine(timeSpan.ToString());
}
private static void UseStringBuilder()
...{
StringBuilder stringBuilder = new StringBuilder();
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
...{
stringBuilder.Append("a");
}
DateTime endTime = DateTime.Now;
TimeSpan timeSpan = endTime - startTime;
Console.WriteLine(timeSpan.ToString());
}
運行CompareString()函數得到以下結果:
| |
運行次數 |
時間 |
| string |
1萬次 |
0.078125秒 |
| StringBuilder |
一百萬次 |
0.046875秒 |
結論:使用StringBuilder對字串動態追加的速度是string的200倍左右。
補充:針對不同的字串長度和不同的操作,比如Remove,效能表現會各不一樣。需要一個一個測試。
摘自:http://blog.csdn.net/xiaomin98/archive/2008/01/15/2045002.aspx