最近在研究一些基礎(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)迷津?。。?
Java中String.intern方法一個(gè)怪異的問(wèn)題
慕工程0101907
2019-01-17 14:31:46