字符串常量池有什么用_字符串常量池在堆中还是方法区

字符串常量池有什么用_字符串常量池在堆中还是方法区看网上的介绍,对于字符串常量池中到底保存的是字符串对象,还是字符串对象的引用,众说纷纭…看jdk1.8对intern()的说明.Whentheinternmethodisinvoked,ifthepoolalreadycontainsastringequaltothisStringobjectasdeterminedbytheequals(…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原文:字符串常量池到底保存的是字符串对象还是字符串对象的引用?

结论

在 JDK 6 及以前版本,字符串常量池保存字符串对象;JDK 6 之后的版本中,既保存了字符串对象,又保存了字符串对象的引用。

证据

public static void main(String[] args) {
    String s = new String("1");
    s.intern();
    String s2 = "1";
    System.out.println(s == s2);

    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);
}

JDK 6 输出 : false false
JDK 7 输出 : false true

JDK 6

String s = new String("1"); 这种创建字符串的方式实际生成了两个字符串对象。首先,构造器中传入一个字符串对象 1,它被放在字符串常量池。然后 JVM 会在堆中再创建一个字符串对象 1,字符串变量 s 指向堆中这个字符串对象 1 的首地址。

当调用 s.intern() 时,由于字符串常量池已经存在字符串 1 了,所以会将字符串常量池中的字符串对象 1 返回。(JDK 7 的情况有所不同,后面会讲。)

再通过 String s2 = "1" 来给变量 s2 赋值时,会将字符串常量池中对象 1 的首地址返回给 s2

由于 s 指向堆中字符串对象 1 的地址,而 s2 指向字符串常量池中 1 的地址,调用 s == s2 的返回值当然是 false

String s3 = new String("1") + new String("1"); 中则涉及字符串常量池中的对象 1 以及拼接而成、保存在堆中的字符串对象 11。当调用 s3.intern(); 时,由于字符串常量池中没有 11,此时会在字符串常量池中生成一个字符串对象 11

同理,由于 s3 指向堆中字符串对象 11 的地址,而 s4 指向字符串常量池中 11 的地址,调用 s == s2 的返回值当然是 false

JDK 7

判断 s==s2 与上文一致,但是在执行 s3.intern(); 时,虽然字符串常量池中还没有字符串对象,由于在上一步 String s3 = new String("1") + new String("1"); 中已经在堆中生成了一个字符串对象 11,所以会将堆中的字符串对象的引用保存到字符串常量池。

这时调用 s3 == s4,两者都指向的是堆中字符串对象 11 的首地址,所以返回值是 true

总结

在 JDK 6 中,当调用字符串的 intern() 时,若字符串常量池先前已创建出该字符串对象,则返回字符串常量池中该字符串对象的引用。否则,将该字符串对象添加到字符串常量池中,再返回该字符串对象的引用。

而在 JDK 7 中,当调用 intern() 时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用。否则,若该字符串对象已经存在于 Java 堆中,则将堆中对此对象的引用添加到字符串常量池中,然后返回该引用;如果堆中不存在,则在池中创建该字符串并返回其引用。

引用

深入解析String#intern

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164768.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Swift3创建数组

    Swift3创建数组数组是由一组类型相同的元素构成的有序数据集合。数组中的集合元素是有序的,而且可以重复出现。1 数组创建在Swift语言中,数组的类型格式为:Array或[ElementType]其中Array中的ElementType表示数组的类型,是泛型写法。[ElementType]是一种简写方式。两者表示的功能是一样的,我们更偏向于使用简写形式,本书里所有数组类型都是使用简写形式。下

    2022年5月27日
    42
  • C++矩阵运算

    C++矩阵运算

    2021年11月19日
    57
  • S如何解决安卓DK无法下载Package问题

    S如何解决安卓DK无法下载Package问题

    2022年1月13日
    47
  • HS数据库_hsqldb

    HS数据库_hsqldb前言在对dao层写测试类的时候,我们需要一个测试数据库,一般我们会是专门建立一个真实的测试数据库,但是有了HSQLDB事情就变得简单了起来。正题一、简介:hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,前言在对dao层写测试类的时候,我们需要一个测试数据库,一般我们会是专门建立一个真实的测试数据库,但是有了HSQLDB事情就变…

    2022年9月22日
    1
  • Day.js 1.8.12 发布,轻量级时间和日期 JavaScript 库

    Day.js 1.8.12 发布,轻量级时间和日期 JavaScript 库Day.js 1.8.12 发布,轻量级时间和日期 JavaScript 库

    2022年4月21日
    55
  • pycharm永久激活码2021【2021.7最新】

    (pycharm永久激活码2021)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号