JVM常量池與String類深入理解

2021-08-09 05:13:28 字數 895 閱讀 4425

建立乙個string有二種形式

第一種形式:

string a = "abc";

string b = "abc";

a引用的字串存放在常量池中,當建立b引用的字串時,會先從常量池中查詢有沒有該字串,如果有,就返回常量池中的字串。如果沒有,就建立該字串物件並放在常量池中,因為字串非常常用,jvm為了提高效能和減少記憶體開銷,就會做這些優化。

下面再舉幾個例子

例一

string a = "abc";

string b = "abc";

system.out.println(a == b);

執行上述** : 結果為true

a和b引用指向的的都是常量池中同乙個string物件的位址 例二

string a = "abc";

system.out.println(a == "abc");

你可能會認為結果為true,不過事情總是沒想象的那麼簡單,

如果使用debug模式,得到的結果為false!

分析:首先例項化了"abc"字串並存放到jvm的常量池中。

常量池分為編譯期常量池和執行時常量池

a == "abc"這段**裡的"abc"是未賦值的的,jvm會對string常量的運算進行優化,未宣告的字串不會在編譯器常量池,只有當你執行時才會例項化字串到執行時常量池中,而宣告的a在編譯器常量池,所以debug為false。讓我們回到print(a == b) //true   print這段**在jvm編譯期可能會跳過,所以,在print內部定義的"abc"是執行期獲取的,比較物件位址,結果輸出為true;

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 堆中建立乙個新的物...