Java中String.intern方法一个怪异的问题

新手上路,请多包涵

最近在研究一些基础知识,看到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中找到相应的引用,怪事一桩,请各位大侠指点迷津!!!

阅读 2.5k
2 个回答

我在自己的机器上测试 #1 情况都是 true

新手上路,请多包涵

intern()方法是有返回值的你str1 = str1.intern() 就可以返回true了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题