string與stringbuilder的區別

2022-01-10 08:39:35 字數 2243 閱讀 1380

1、分析string與stringbuilder的區別,我們先來看下面一段**

首先我們使用string進行字串的拼接

class program

//結束計時

sw.stop();

console.writeline(str);

//輸出程式執行的時間

console.writeline(sw.elapsed);

console.readkey();}}

程式執行結果如下:

我們可以看到此時使用string程式的執行時間為0.125秒左右

下面我們再使用stringbulider

class program

//結束計時

sw.stop();

console.writeline(sb.tostring());

//輸出程式執行時間

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

1 string是乙個類,string是一種資料型別.2 string是c 中的類,string是.net framework的類 在c ide中不會顯示藍色 3 c string對映為.net framework的string 4 如果用string,編譯器會把它編譯成string,所以如果直接用...

string與string標頭檔案

先來段 我是在vs2012上實驗的 include stdafx.h include include include using namespace std int tmain int argc,tchar argv cout endl for rit mapstudent.rbegin rit m...

String與string的區別

c 是區分大小寫的,但是我卻發現c 中同時存在string與string,於是我很困惑,於是我上網搜尋了一下,於是我了解了一些小知識。msdn中對string的說明 stringis analiasforstringin the net framework。string是string的別名而已,st...