1. 程式人生 > >JVM常量池與String類深入理解

JVM常量池與String類深入理解

深入理解java String與JVM常量池

建立一個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;