美文网首页
String-intern()

String-intern()

作者: guideEmotion | 来源:发表于2019-08-18 08:28 被阅读0次

总结

一 创建了几个对象?

String s = new String("1");

在jdk1.6中,创建了2个。
分别是常量池中得对象1,和堆中得对象s(值也为1)

二 jdk6和7中intern的差别

注意这是intern的步骤,不是所有字符串创建的步骤
jdk1.6中字符串常量池存放在永久代中:
当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。

jdk1.7中字符串常量池存放在堆中:
当使用intern()方法时,先查询字符串常量池是否存在当前字符串,若字符串常量池中不存在则再从堆中查询,然后存储并返回相关引用
若都不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。

三 示例一

String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);

String s3 = new String("1") + new String("1");//区别,这步不会再常量池中创建和s3等值的字符串
s3.intern();
String s4 = "11";//上面的intern导致常量池中已存在了11字符串
System.out.println(s3 == s4);

jdk6:false false
jdk7:false true

四 示例二

String s = new String("1");
String s2 = "1";
s.intern();
System.out.println(s == s2);

String s3 = new String("1") + new String("1");
String s4 = "11";//提前导致直接再字符串常量池创建了11。一直强调:上面的步骤是intern的步骤
s3.intern();
System.out.println(s3 == s4);

jdk6;false false
jdk7:false false

为什么String s4 = "11"会导致结果变化?
这行代码在常量池中找字符串时,可不会像intern的步骤一样!!!

相关文章

  • String-intern()

    总结 一 创建了几个对象? 在jdk1.6中,创建了2个。分别是常量池中得对象1,和堆中得对象s(值也为1) 二 ...

网友评论

      本文标题:String-intern()

      本文链接:https://www.haomeiwen.com/subject/xjolsctx.html