字串的分配,和其他的物件分配一樣,耗費高昂的時間與空間代價,作為最基礎的資料型別,大量頻繁的建立字串,極大程度地影響程式的效能
jvm為了提高效能和減少記憶體開銷,在例項化字串常量的時候進行了一些優化
為字串開闢乙個字串常量池,類似於快取區
建立字串常量時,首先堅持字串常量池是否存在該字串
存在該字串,返回引用例項,不存在,例項化該字串並放入池中
從jdk api的開發文件中我們發現
string物件被建立,和其他物件一樣會先在棧 中建立乙個物件的引用(用於存放位址),
但是並不直接在堆中存放字串 資料,而是現在一塊專門 叫做「常量池」的記憶體裡面開闢乙個空間內容為字串的內容。
**如下:
string str1 = 「abc」;
string str2 = 「abc」;
string str3 = 「abc」;
string str4 = new string(「abc」);
string str5 = new string(「abc」);
前3行可以認為是直接將「abc」這個字串常量的位址存在str1,str2,str3 中
而用new 方法建立的str物件則會在堆中建立物件的內容,而其中的值也是從常量池中來的。
所以測試**:
這裡還要插入乙個編譯期和執行期的概念
程式在編譯期時會先在常量池中初始化所有常量,進入執行期時才會將棧和堆中的資料初始化。
String類和常量池
1.全域性字串常量池 string pool 全域性字串常量池中存放的內容是在類載入完成後存到string pool中的,在每個vm中只有乙份,存放的是字串常量的引用值 在堆中生成字串物件例項 2.class檔案常量池 class constant pool class常量池是在編譯的時候每個cla...
String類和常量池
string物件的兩種建立方式 string str1 abcd 先檢查字串常量池中有沒有 abcd 如果字串常量池中沒有,則建立乙個,然後 str1 指向字串常量池中的物件,如果有,則直接將 str1 指向 abcd string str2 new string abcd 堆中建立乙個新的物件 s...
String 類和常量池
1 string 物件的兩種建立方式 string str1 abcd 先檢查字串常量池中有沒有 abcd 如果字串常量池中沒有,則建立乙個,然後 str1 指向字串常量池中的物件,如果有,則直接將 str1 指向 abcd string str2 new string abcd 堆中建立乙個新的物...