鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ Java中String.intern方法一個(gè)怪異的問(wèn)題

Java中String.intern方法一個(gè)怪異的問(wèn)題

最近在研究一些基礎(chǔ)知識(shí),看到Java中的常量池及String.intern方法,也在網(wǎng)上找了一些示例代碼在自己機(jī)器上運(yùn)行,但是發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,如下代碼:

// #0
String str1 = new String("0") + new String("0");
str1.intern();
String str2 = "00";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true

// #1
String str1 = new String("1") + new String("1");
str1.intern();
String str2 = "11";
// 不知道為什么不是指向同一個(gè)引用
System.out.println(str1 == str2); //  false,        
// 兩個(gè)變量的hashCode也是相等的
System.out.println(str1.hashCode() == str2.hashCode()); // true
System.out.println(str1.equals(str2)); // true


// #2
String str1 = new String("2") + new String("2");
str1.intern();
String str2 = "22";

System.out.println(str1 == str2); // true        
System.out.println(str1.equals(str2)); // true

搞不明白為什么兩個(gè)new String("1") + new String("1")相加之后的變量intern的時(shí)候,再定義一個(gè)一樣的string就不會(huì)指向StringPool中的地址!

上述代碼#1更改為如下寫(xiě)法:

// #1-Update
String str1 = (new String("1") + new String("1")).intern();
String str2 = "11";
System.out.println(str1 == str2); //  true           
System.out.println(str1.equals(str2)); // true

又能在StringPool中找到相應(yīng)的引用,怪事一樁,請(qǐng)各位大俠指點(diǎn)迷津?。。?/p>

回答
編輯回答
背叛者

我在自己的機(jī)器上測(cè)試 #1 情況都是 true

2018年3月18日 09:24