string與stringbuilder的區別
1、分析string與stringbuilder的區別,我們先來看下面一段代碼
首先我們使用string進行字符串的拼接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Program
{
static void Main( string [] args)
{
//StringBuilder sb = new StringBuilder(); string str = null ;
//創建一個計時器,計算程序運行的時間
Stopwatch sw = new Stopwatch();
//開始計時
sw.Start();
for ( int i = 1; i < 10000;i++ )
{
//sb.Append(i);
str += i;
}
//結束計時
sw.Stop();
//Console.WriteLine(sb.ToString());
Console.WriteLine(str);
//輸出程序運行的時間
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
}
}
|
程序運行結果如下:
我們可以看到此時使用string程序的運行時間為0.125秒左右
下面我們再使用stringbulider
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Program
{
static void Main( string [] args)
{
StringBuilder sb = new StringBuilder();
//string str = null;
//創建一個計時器,計算程序運行的時間
Stopwatch sw = new Stopwatch();
//開始計時
sw.Start();
for ( int i = 1; i < 10000;i++ )
{
sb.Append(i);
//str += i;
}
//結束計時
sw.Stop();
Console.WriteLine(sb.ToString());
//Console.WriteLine(str);
//輸出程序運行時間
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
}
}
|
此時程序運行結果為
我們可以看到使用stringbuilder程序運行時間只有0.0021秒左右,相比較與string程序運行速度快了許多倍
2、那麽為什麽stringbuilder的運行速度會比string快那麽多呢
首先,我們看string:
(1)、string字符串,為引用類型,其具有不可變性。
我們一般認為的將內存分為五個區域。其中程序員常用的有三個,即棧、堆,靜態存儲區域。
其中值類型的值存儲在棧中,如int類型,而引用類型的值存儲在堆中
如下圖所示
而一旦我們將str的值改變 str=“李四” 看似我們改變的str的值,實際上
當str=“李四”時,我們在堆中新創建了一個對象“李四”其地址自然發生改變0x001001被幹掉,換成了李四在堆中的地址0x002003
即看似我們改變了str的值,實際上卻創建了一個新的對象。
我們可以用一個簡單的代碼看一下其實際的運行情況:
我們使用監視器跟蹤str其中 *str跟蹤其地址,可以看到此時str的地址為0x00000000
使用逐語句進行調試
當str的值為“張三”後其地址發生了改變
而當str=“李四”後其地址又發生了改變
因此string類型具有不可變性,一旦其值發生了改變,就是一個新的對象。即每次對字符串進行操作時就會產生一個新的對象。
(2)、而StringBuilder類解決了在對字符串進行重復修改的過程中創建大量對象的問題。StringBuilder類以Char為單位向字符串分配空間,所以操作中不需要進行額外的內存分配。
對stringbuilder我們也可以使用上述代碼來說明。
我們可以看到整個過程並不會發生地址的改變。
綜上,如果操作少量的數據,我們可以使用string
如果有大量的字符拼接等操作,我們應使用stringbuilder。
萬丈高樓平地而起,基礎最重要!
關於string 與stringbuilder的一些常用方法會在下篇博客簡單總結。
string與stringbuilder的區別