1、先看乙個例子
string str1 = new string("a")+ new string("b");
system.out.println(str1 == str1.intern());
system.out.println(str1 == "ab");
jdk1.8的輸出結果:
true
true
上邊例子加一行**其餘不變:
string str2 = "ab";
string str1 = new string("a")+ new string("b");
system.out.println(str1 == str1.intern());
system.out.println(str1 == "ab");
jdk1.8的輸出結果:
false
false
只是定義了乙個str2,應該和str1沒有什麼關係吧,但是為什麼會影響到最終的結果呢?
這時候就需要我們深入了解intern()
方法了!!!
2、深入了解intern()方法
jdk1.6以及以前版本中,常量池是放在 perm 區(屬於方法區)中的,熟悉jvm的話應該知道這是和堆區完全分開的。jdk1.7後,常量池被放入到堆空間中,這導致intern()函式的功能不同,具體怎麼個不同法,且看看下面例子,分析圖是直接貼上過來的:
string s = new string("1");
s.intern();
string s2 = "1";
system.out.println(s == s2);
string s3 = new string("1") + new string("1");
s3.intern();
string s4 = "11";
system.out.println(s3 == s4);
輸出結果
jdk1.6以及以下:false false
jdk1.7以及以上:false true
再分別調整上面**2.3行、7.8行的順序:
string s = new string("1");
string s2 = "1";
s.intern();
system.out.println(s == s2);
string s3 = new string("1") + new string("1");
string s4 = "11";
s3.intern();
system.out.println(s3 == s4);
輸出結果:
jdk1.6以及以下:false false
jdk1.7以及以上:false false
2.1、jdk1.6分析
jdk1.6及以下版本intern()的作用:檢查常量池裡是否存在這個字串,如果存在,就返回池裡的字串;如果不存在,該方法會把這個字串新增到常量池中,然後再返回它的引用。
先看第一段**:
2.1、jdk1.7+分析
jdk1.7以及以上的版本intern()的作用:檢查常量池裡是否存在這個字串,如果存在,就返回池裡的字串;如果不存在,該方法會把這個字串在堆記憶體中的位址新增到常量池中,然後再返回這個位址。
先看第一段**的情況:
再看第二段**:
3、總結
看完這些再看開篇時候的例子就很清楚了吧。最後總結以下:
intern()的作用:檢查常量池裡是否存在這個字串,如果存在,就返回池裡的字串;如果不存在,jdk1.6及以下版本會把這個字串新增到常量池中,jdk1.7以及以上的版本則把這個字串在堆記憶體中的位址新增到常量池中。
String拓展 intern 方法
string s1 new string 1 new string 1 s1變數記錄的位址為 new string s1.intern 在字串常量池中生成 11 如何理解 jdk6 建立了乙個新的物件 11 也就有新的位址 jdk7 此時常量池中並沒有建立 11 而是建立了乙個指向堆空間中new s...
String中intern的方法
首先檢視官方api那個的解釋 intern public stringintern 返回字串物件的規範化表示形式。乙個初始時為空的字串池,它由類 string 私有地維護。當呼叫 intern 方法時,如果池已經包含乙個等於此 string 物件的字串 該物件由 equals object 方法確定...
String中intern的方法
intern public string intern 返回字串物件的規範化表示形式。乙個初始時為空的字串池,它由類 string 私有地維護。當呼叫 intern 方法時,如果池已經包含乙個等於此 string 物件的字串 該物件由 equals object 方法確定 則返回池中的字串。否則,將...