c 基礎 字串的不可變性和駐留機制

2022-01-21 14:03:23 字數 1444 閱讀 2790

.堆的分配向高位址擴充套件,棧的分配向低位址擴充套件。

字串的不可變性(恆定性):

當你給乙個字串重新賦值之後,老值並沒有被銷毀(覆蓋),而是重新開闢了一塊空間儲存新值il(中可以檢視)

所以我們使用字串擴充套件方法時,其實都是乙個新的物件(trim)

字串的駐留機制

//clr中維護著乙個駐留池(intern pool)的雜湊表(hashtable),這個表記錄了所有在**中使用字面量宣告的字串例項的引用

//使用字面量宣告的字串都會被記錄到散駐留池(雜湊表 鍵為字串 值為字串儲存位址)

從下圖我們可以看出str和str1在堆中的位址是一樣的,而在棧中位址是不一樣的。

什麼是字面量?

//字面量是源**中書寫的數字或字串,用來表示乙個明確型別的明確、固定的值。

//字串字面量(string literal)是指雙引號引住的一系列字元,字串字面量使用雙引號標記

如:string str="abc"; 或 string str="a"+"bc"這種就可以稱為字面量

但是 string str=變數+變數 或者 變數+字串 這種都不能稱為字面量

//intern方法接受乙個字串作為引數,它會在駐留池中檢查是否存在引數所表示的字串。

//如果存在,則返回那個駐留池中的字串的引用;否則向駐留池中加入乙個新的表示相同值的字串,

//並返回這個字串的引用。不過要注意的是,就算intern方法在駐留池中找到了相同值的字串,

//也不能讓您省卻一次字串記憶體分配的操作,因為作為引數的字串已經被分配了一次記憶體了。

//而使用intern方法的好處在於,如果intern方法在駐留池中找到了相同值的字串,

//此時雖然在記憶體中存在兩份該字串的副本(乙份是引數,乙份是駐留池中的),

//引數所引用的那個副本會被垃圾**掉,這樣對於該字串記憶體中就不存在冗餘了。

string.intern 和string.isinterned區別

intern:判斷我們要加的字串是否在駐留池中,如果駐留池中存在就返回引用,如果不存在就加入駐留池中並返回引用

isinterned:判斷字串是否在駐留池中,如果在就返回引用,不存在就返回null.

//正是字串的恆定性,才造就了字串的駐留機制,

//也為字串的執行緒同步工作大開方便之門(同乙個字串物件可以在不同的應用程式域中被訪問,

//所以駐留的字串是程序級的,垃圾**不能釋放這些字串物件,只有程序結束這些物件才被釋放)。

字串的不可變性

字串的不可變性,從字面的意思上理解,這個 不可變 視乎是不成立的。通過賦值操作我們發現我們可以更改字串變數的值,這種改變並不能推翻 字串不可變性 中的不可變。也就是說字串變化並不指的是賦值這種變化。通過字串型別和值型別在記憶體中的儲存方式對比看看,字串中的不可變到底指的是什麼?值型別 字串 不可變性...

C 字串常用操作和字串的不可變性

c 字串常用方法 方法作用 int len str.length 獲取字串中字元個數 str str.toupper 將字串中所有字元轉換成大寫 str str.tolower 將字串中所有字元轉換成小寫 bool b str1.equals str2,stringcomparison.ordina...

C 字串是不可變的

string型別的關鍵特徵是在於它是不可變的 immutable 可以為string變數賦乙個全新的值,但出於效能方面考慮,沒有提供修改字串內容的機制。所以不可能將字串中的字幕全部轉換為大寫。只能新建字串,讓它成為舊字串的大寫字母版本,但舊字串在這個過程中不會被修改。1 錯誤,string是不可改變...