字串的內部儲存原理

2021-08-28 13:22:38 字數 1008 閱讀 4470

字串是乙個字面量,它的值儲存在常量池中(也就是方法區的執行時常量池),他的底層是使用字元陣列來儲存,它是可以共享的。以下展示直接字串與字串物件的儲存。

其中string s1 = 「ab」;會產生乙個物件,也就是它底層的字元陣列。

單獨的string s2 = new string(「ab」);是會產生兩個物件的,也就是堆記憶體中new出來的物件,和字元陣列。

如果兩個同時建立則只會產生兩個物件,也就是字元陣列和堆記憶體中new出來的物件。至於方法區的常量池中的字面量和字元陣列會共享。

public class stringdemo1 

}

這裡需要注意幾個點:

①兩個字面量在運算的時候為了提高效率,在編譯的時候會進行自動的計算優化。也就是在寫出string str = 「a」 + 「b」; 和string str = 「ab」;的編譯完成時的效果是一樣的。

②當以new的形式去建立乙個字串的時候,指標直接指向的位址是堆記憶體中的位址。

③當變數和常量進行相加的時候是不會再編譯期自動運算的。而是建立乙個stringbuilder然後在後面追加乙個字串,然後再new乙個新的對向也就是它的tostring方法。最後指向的是這個tostring之後所new的物件。

string str = 「a」;

string str1 = 「b」;

str = str + str1;

①new stringbuilder(「a」); // 這時會產生乙個新的物件

③.tostring();// 這時會new乙個string的物件。

前前後後涉及到了5個物件也就是拼接好一次需要多產生3個物件。

也就是上述過程的②③步驟,會多產生2個物件。需要注意的是stringbuilder只是在最後一次tostring一把而在使用+的時候每次連線都會tostring一把。

String字串的儲存原理

string s1 abc string s2 def gh 這兩行 表示在底層建立了三個字串物件,都在字串常量池中。string s3 newstring xy 這是使用new的方式建立的字串物件,凡是雙引號括起來的都在字串常量池中有乙份。new物件的時候一定在堆記憶體中開闢空間。user use...

字串常量的內部表示

文章所寫內容,都是自己實際程式設計中遇到的,通常是在遇到這個問題時,在網上搜尋或者自己找到解決辦法。有時候,某些問題要花好久才找的到解決方案,因為網上資料較少,也有可能是我搜尋能力不強。寫下這些,一是希望能幫助到遇到同樣問題的朋友,二是記下之後,再次遇到這些問題,能記得解決辦法。由於平時工作都很忙,...

Head First C 字串原理

char tracks 80 編譯器可以識別有 5 個字串,第乙個 內可以不寫明數字,第二個方括號內是用來儲存單獨字串的字元數,定義歌名不超過79個字元 因為每個字串都是乙個陣列,現在是字串的陣列,所以是陣列的陣列。陣列的陣列在儲存器中 i left myhe arti nhar v new ark...