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

字符串常量池有什么用_字符串常量池在堆中还是方法区看网上的介绍,对于字符串常量池中到底保存的是字符串对象,还是字符串对象的引用,众说纷纭…看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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux nslookup命令安装,在CentOS中安装nslookup命令

    linux nslookup命令安装,在CentOS中安装nslookup命令域名查询工具nslookup并不是Win系统的专利,Linux系统中也可以使用,不过要安装,默认没有。在CentOS中安装nslookup命令:$sudoyuminstallbind-utils这个bind-utils包,就包含了nslookup命令。Ubuntu系统应该也是一样的,还没有测试过。nslookup是一个能够查询互联网域名服务器信息的程序。他有两种工作模式,即“交互模式”和“…

    2022年10月19日
    0
  • Android中bindService的使用方法

    Android中bindService的使用方法bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。   bindService方式的一般过程:①新建Service类BindService。在BindService类里新建内部类MyBinder,继承自Bind

    2022年6月6日
    28
  • pycharmdjango项目实战_pycharm django环境搭建

    pycharmdjango项目实战_pycharm django环境搭建创建项目我们创建django项目有两种方式,命令行方式和使用pycharm工具创建,本文就介绍常用的pycharm工具创建首先点击django,输入项目的名称,选择创建好的虚拟环境,最后点击cre

    2022年7月31日
    5
  • socket常用函数_socket是可重入函数吗

    socket常用函数_socket是可重入函数吗前言socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写.具体介绍见本博客另一篇文章:https://blog.csdn.net/wufuhuai/article/details/79747912实现我们都知道socket不仅能够进行跨进程通信,而且socket是可以双向通信的,即是…

    2022年10月14日
    1
  • pytorch之dataloader,enumerate

    pytorch之dataloader,enumeratefromtorch utils dataimportTe utils dataimportDa torch tensor 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 b tor

    2025年8月1日
    0
  • html实战-制作静态网页「建议收藏」

    html实战-制作静态网页「建议收藏」教程视频:http://edu.csdn.net/course/detail/535 从42开始制作的网页:http://www.cnos.co/整体思路:先布局再CSS控制骨架搭好了,初始化样式,后再弄CSS样式。注意:将CSS的样式导入到外部样式表时,要注意图片的位置,以及对外部样式表的引入  1、头部的背景图片的高度128px来自素材的图片高,容器的宽度大

    2022年9月5日
    4

发表回复

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

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