最近在研究一些基础知识,看到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
中找到相应的引用,怪事一桩,请各位大侠指点迷津!!!
我在自己的机器上测试
#1
情况都是true