本帖最后由 rwkk12138 于 2021-10-14 17:37 编辑
先看以下代码
[Java] 纯文本查看 复制代码 public static void main(String[] args) {
String s1 = new StringBuilder("b").append("ad").toString();
String s2 = "bad";
System.out.println(s1.intern() == s1);
System.out.println(s1 == s2);
String s3 = new StringBuilder("go").append("od").toString();
System.out.println(s3.intern() == s3);
String s4 = "good";
System.out.println(s3 == s4);
String s5 = new StringBuilder("ja").append("va").toString();
System.out.println(s5.intern() == s5);
}
结果输出是:
false
false
true
true
false
翻阅文档,找到了Java intern() 方法的介绍
intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。参数:无返回值:一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
在自己搞明白这个方法的规则后,我小结了以下几点:
1.在debug查看对象的时候s1.intern()返回的是s2堆地址,查阅相关资料后发现JDK1.7之后调用intern方法后不在将堆中的常量副本拷贝到常量池中,替代的是在常量池中生成一个对字符串的引用
2.调用intern()方法时的大概流程是先去常量池中寻找字符串是否存在,找到则返回改字符串的引用,否则将在常量池中生成一个对原来字符串的引用
3.同样的如果直接使用字面量去创建字符串对象时也是与调用intern()方法流程同样,只不过是在编译期间进行的,经实践发现即使使用‘+’连接,也会在编译期间直接将字符串存入常量池中 |