美文网首页CAFEBABY
【你可能不知道的java小知识】--String.intern(

【你可能不知道的java小知识】--String.intern(

作者: 破东风CAFEBABY | 来源:发表于2016-10-06 17:01 被阅读54次

String.intern()是String类一个常用的本地方法,它的作用是把一个字符串放入常量池并返回对常量池中这个字符串的引用。要注意的是在JDK1.7之后,对这个方法做了一些修改,如果这个字符串在常量池中还不存在,那么返回的是在堆上的引用,并没有把这个字符串复制到常量池,在JDK1.7之前,这种情况下就会有1个复制的操作,把字符串复制到常量池后返回常量池中的引用。

代码示例:
String s1 = new StringBuilder().append("ab").append("cd").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder().append("ja").append("va").toString();
System.out.println(s2.intern() == s2);
JDK1.7执行结果:

true
false

结果说明:

在执行s1.intern()的时候,"abcd"这个字符串在常量池中不存在,所以返回的是本身的引用,s1.intern() == s1结果是true;
在执行s2.intern()的时候,"java"这个字符串在常量池中已经存在,所以返回的是在常量池中的引用,和s2自然就不是同一个对象了。

intern()内存模型示意图

相关文章

网友评论

  • jijs:常量池中是没有java对象,常量池中只是引用。s2是new出的对象地址 s2.intern是常量池中引用的对象,所以不想等。对象都在堆中存在的。你这个图画的有点问题。
  • e4f64c5b3eb2:为什么java在常量池中存在吖?

本文标题:【你可能不知道的java小知识】--String.intern(

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