基於Java中字符串內存地位詳解。本站提示廣大學習愛好者:(基於Java中字符串內存地位詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是基於Java中字符串內存地位詳解正文
媒介
之前寫過一篇關於JVM內存區域劃分的文章,然則昨天接到螞蟻金服的面試,問到JVM相干的內容,說明一下JVM的內存區域劃分,這部門答得還不錯,然則後來又問了Java外面String寄存的地位,之前只記得String是一個不變的量,應當是要寄存在常量池外面的,然則後來問到new一個String出來應當是放到哪裡的,這個應當是放到堆外面的,後來又問到String的援用是放在甚麼處所的,其時傻逼的說也是放在堆外面的,如今總結一下:根本類型的變量數據和對象的援用都是放在棧外面的,對象自己放在堆外面,顯式的String常量放在常量池,String對象放在堆中。
常量池的解釋
常量池之前是放在辦法區外面的,也就是在永遠代外面的,從JDK7開端移到了堆外面。這一轉變我們可以從oracle的release version的notes裡的** Important RFEs Addressed in JDK 7 **看到。
Area: HotSpot Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences. RFE: 6962931
String內存地位解釋
1.顯式的String常量
String a = "holten"; String b = "holten";
•第一句代碼履行後就在常量池中創立了一個值為holten的String對象;
•第二句履行時,由於常量池中存在holten所以就不再創立新的String對象了。
•此時該字符串的援用在虛擬機棧外面。
1.String對象
String a = new String("holtenObj"); String b = new String("holtenObj");
•Class被加載時就在常量池中創立了一個值為holtenObj的String對象,第一句履行時會在堆裡創立new String("holtenObj")對象;
•第二句履行時,由於常量池中存在holtenObj所以就不再創立新的String對象了,直接在堆裡創立new String("holtenObj")對象。
驗證一下
/** * Created by holten.gao on 2016/8/16. */ public class Main { public static void main(String[] args){ String str1 = "高小天"; String str2 = "高小天"; System.out.println(str1==str2);//true String str3 = new String("嵬峨天"); String str4 = new String("嵬峨天"); System.out.println(str3==str4);//false } }
前往成果:
true false
以上這篇基於Java中字符串內存地位詳解就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。