string 型別是c#中使用最頻繁的型別,因此clr用專門的方法來處理、優化string,使得string雖然你是引用型別,但在表現上被.net優化為值型別。
先看string的定義是:
publicsealed
class string : icomparable, icloneable, iconvertible, icomparable, ienumerable, ienumerable, iequatable
從這裡我們可以得知:
string的本質是字元集合,因此,linq to object 的操作能作用在string上。
string是sealed,該特性是為字串不變性(恒等性,immutability)和字串駐留機制提供有效保證。(子類無法繼承,因此無法破壞clr對string的特殊處理機制)
這個特性的表現是,當對例項使用:
insert(),padleft(),remove(),replace(),substring(),toupper(),tolower(),trim()
等方法時,原有的字串仍然在記憶體中,不被改變,對例項操作的結果需要在記憶體中建立新的字串物件。
這樣做的好處:
1)保證原string物件的穩定性。
2)string不會出現執行緒同步問題。
這樣做的壞處:
效能和記憶體的雙重。
為了應對這個缺點,clr使用了雜湊表型別的暫存池。
雜湊表的key是string,value則是儲存託管堆中的位址。當jit編譯方法時,會首先在雜湊表中查詢每乙個字串常量,如果找不到,則在表中建立乙個鍵值對;如果找到,則將找到的鍵值對的value值賦給這個物件。
例子:
string stra = "abc"
;
string strb = "
abc"
;
bool b=referenceequals(stra, strb);//true
這邊名stra和strb指向的是同乙個位址。
兩個方法
isinterned和intern
根據msdn對isinterned的描述:
此方法在暫存池中查詢 str。 如果已經將 str 放入暫存池中,則返回對此例項的引用;否則返回 null。
例子:
string s1="abc"
;
string s2=string
.isinterned(s1);
console.writeline(s2);//"abc"
很奇怪的一點是:
string s1=string.isinterned("def"
); console.writeline(s1); //"def"
預料中結果是null,因為"def"此時並不在暫存表中。結果列印出了"def"。猜測可能是當寫"def"時,暫存池中已經將其加入了。
string s1 = "abc"
;
string s2 = s1+ "
def"
;
string s3 = string
.isinterned(s2);
console.writeline(s3); //null
string s4 = "abcdef";
string s1 = "
abc"
;
string s2 = s1+ "
def"
;
string s3 = string
.isinterned(s2);
console.writeline(s3); //"abcdef"
而intern的意思相似:
如果暫存了 str,則返回系統對其的引用;否則返回對值為 str 的字串的新引用。
區別是:intern如果在暫存池中查詢不到該str時,則將該str新增到暫存池中,而isinterned則不新增。
例子:
string stra = "abcdef";
string strb = "
abc"
;
string strc = strb + "
def"
;
var b1 =referenceequals(stra, strc); //false,因為strc是動態構造的,因此這樣的字串不會被新增到暫存池中維護
strc = string
.intern(strc); //由於strc不在暫存池中,則將其新增進去。
var b2 =referenceequals(stra, strc); //true
*本文依據《你必須知道的.net》一書總結
Java 中字串的不變性
string 物件建立後則不能被修改,是不可變的,所謂的修改其實是建立了新的物件,所指向的記憶體空間不同。如下所示 執行結果 結合上面的 關於字串必須需要了解 1 通過 string s1 愛慕課 宣告了乙個字串物件,s1 存放了到字串物件的引用,在記憶體中的存放引用關係如下圖所示 然後通過 s1 ...
區塊鏈最重要的特性是不變性
不可變性是乙個突出的特性,可以在區塊鏈上進行最佳利用,使用此特性,網路中的使用者無法刪除或 更改系統上記錄的資訊。r3研究主管安東尼?劉易斯 antony lewis 表示 當人們說區塊鏈是不可變的時候,他們並不意味 著資料不能被改變,他們的意思是,如果沒有共謀,改變是極其困難的,如果你嘗試了,就非...
字串 什麼是字串匹配演算法?
字串 string 是由 n 個字元組成的乙個有序整體 n 0 例如,s beijing s 代表這個串的串名,beijing 是串的值。這裡的雙引號不是串的值,作用只是為了將串和其他結構區分開。字串的邏輯結構和線性表很相似,不同之處在於字串針對的是字符集,也就是字串中的元素都是字元,線性表則沒有這...