1. 程式人生 > >string與stringbuilder的區別

string與stringbuilder的區別

簡單的 因此 line builder aps uil 先來 內存 總結

https://www.cnblogs.com/hunternet/p/4712661.html

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的區別