String.intern()方法解惑

在日常编码中,String.intern()不算是一个常用的方法,但是很多同学在面试的时候都会碰到这个问题(鄙视一下这些面试官),这里我们基于内存来详细分析一下这个方法。
String.intern()是一个Native方法,它的作用是:如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。先上代码:

String str1 = new StringBuilder("i'm").append(" T").toString();
System.out.println(str1.intern()==str1);

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);

这段代码在JDK1.6中运行,会得到两个false,而在JDK1.7和1.8中运行会得到一个ture和一个false。这个差异的原因是:

  • 在JDK1.6中,intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用,而由StringBuilder创建的字符串实例在Java堆上,所以必然不是同一个引用。
  • 而JDK1.7中已经将运行时常量池从永久代移除,在Java 堆(Heap)中开辟了一块区域存放运行时常量池。因此intern()返回的引用和由StringBuilder创建的那个字符串实例是同一个。
  • str2的比较返回false是因为“java”这个字符串在执行 StringBuilder.toString()之前已经出现过,字符串常量池中已经有它的引用了,不符合“首次出现”的原则,而“i'm T”这个字符串则是首次出现的,因此返回true。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,777评论 5 44
  • 一、String 类 1、定义: 1、从概念上讲,java字符串就是Unicode字符序列。每个用双引号括起来的字...
    玉圣阅读 5,607评论 0 1
  • 写着写着发现简书提醒我文章接近字数极限,建议我换一篇写了。 建议52:推荐使用String直接量赋值 一般对象都是...
    我没有三颗心脏阅读 5,199评论 2 4
  • 远山的景 无需浓墨重彩 便可以入眸 近水的影 只需云淡风轻 便足以入心 这世上 有一种遇见 深深的 暖在心间 近近...
    sun熙熙微光ny阅读 2,795评论 0 2
  • 时隔十年再度举办武林盛会——名剑英雄会,名剑山庄得到了各门派的鼎力相助,也吸引了所有武林人士的目光。 然而,各门派...
    周寒舟阅读 8,328评论 52 85

友情链接更多精彩内容