最近在研究一些基礎知識,看到Java中的常量池及String.intern方法,也在網上找了一些示例代碼在自己機器上運行,但是發現一個奇怪的問題,如下代碼:
// #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";
// 不知道為什么不是指向同一個引用
System.out.println(str1 == str2); // false,
// 兩個變量的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
搞不明白為什么兩個new String("1") + new String("1")相加之后的變量intern的時候,再定義一個一樣的string就不會指向StringPool中的地址!
上述代碼#1更改為如下寫法:
// #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中找到相應的引用,怪事一樁,請各位大俠指點迷津?。?!
Java中String.intern方法一個怪異的問題
慕工程0101907
2019-01-17 14:31:46