string和StringBuilder

string 字符串性能

定義語法:string s=」abc」  string str=new string(new char[]{‘a’,’b’,’c’})ui

 

stringStringspa

string is an alias for String in the .Net Framework線程

string 是String的別名,string是C#的類型,String是.Net Framework的類型3d

string通過編譯變成String,爲了符合語法,建議使用string指針

 

Immutable字符串不變性blog

代碼分析:進程

string s=」abc」 在堆上開闢空間存儲變量s的值」abc」,在棧上存儲s,將指針指向堆上的地址內存

s=」abcd」 在堆上開闢空間存儲變量s的值」abcd」,將棧上的s指向的地址指向」abcd」字符串

由圖可知,字符串不變性是指字符串值的變動,原有值並不會馬上從內存中消失,而是等待GC回收,所以在有頻繁字符串的切割、拼接等字符操做時,應當使用StringBuilder

 

Intern Pool 駐留池

駐留池是指CLR維護的一個HashTable,鍵爲字符串的值,值爲字符串在堆中的地址,存儲的字符串是字面量字符串,當新的字面量字符串新建時,

若是駐留池中存在同值字符串,則新的字符串的引用指向該字符串的地址。

 

字面量字符串,string str=」abc」  string str=@」abc」  string str=」abc」+」def」

英文雙引號包括的或@+英文雙引號包括的

代碼分析:

string s=」abc」 在堆區開闢空間存儲變量s,在棧中存儲s,並將引用指向堆中地址

string b=」abc」 檢查駐留池中是否有」abc」,存在,在棧中新建變量b,將引用指向堆

變量b和s在堆中地址一致,說明駐留池機制也說明了字符串的不變性。

同時駐留池的存活週期同程序進程一致,爲字符串的線程同步提供基礎,即駐留池中的字符串是進程級

 

stringStringBuilder

StringBuilder 動態串,從字面意思來看,StringBuilder是的長度是能夠變化的

StringBuilder是值類型,是爲處理複雜頻繁的字符串操做而存在的

代碼分析:

StringBuilder sb=new Stringbuilder(「Hahaha」) 在堆中開闢空間存儲變量sb,值爲」Hahaha」,在棧中存sb,引用指向堆中地址

sb.Append(「123」) 根據棧中引用找到堆中地址,當初始分配內存不足,自動擴展,並將存放值變爲」Hahaha123」

由圖可看出StringBuilder是對同一塊內存操做,而字符串的更改會佔用內存,所以對於頻繁的字符串操做

StringBuilder,而對於次數較少用string,由於StringBuilder對內存操做佔用CPU,在必定程度上影響性能。

相關文章
相關標籤/搜索