到底什麼是字串的不變性?

2022-09-19 08:12:06 字數 2625 閱讀 8094

string 型別是c#中使用最頻繁的型別,因此clr用專門的方法來處理、優化string,使得string雖然你是引用型別,但在表現上被.net優化為值型別。

先看string的定義是:

public

sealed

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 是串的值。這裡的雙引號不是串的值,作用只是為了將串和其他結構區分開。字串的邏輯結構和線性表很相似,不同之處在於字串針對的是字符集,也就是字串中的元素都是字元,線性表則沒有這...