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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】

    【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】正在兢兢业业的当一个打工仔,有一个小伙伴问我能不能用Unity制作3D动态壁纸。我一寻思应该问题不大,因为之前用Unity简单制作过一个PC端的桌面宠物,开启Unity背景穿透模式能有一个壁纸的效果。但是仔细一想在手机端也这样做的话好像不能直接套用…所以在网上搜索了一下有没有什么简单可行的方法。然后我发现Unity有一款专门用来做动态壁纸的插件:uLiveWallpaper所以本篇文章就来使用这款插件制作一款最基础的3D重力感应动态壁纸,下面一起看看如何制作吧~

  • 【游戏】光棍节程序员闯关秀过关攻略「建议收藏」

    【游戏】光棍节程序员闯关秀过关攻略「建议收藏」光棍节,与我无关,结果昨夜下了场雨,导致路面结冰,大侠的出行计划泡汤了,只好在家淘宝抢东西。结果网友发来一个光棍节程序员闯关秀游戏,让大侠一发不可收拾。。。游戏地址http://segmentfault.com/game/花了两个小时过了9关,最后一关没过去。欢迎大家补充。第一关:本关用右键查看URL就能得到地址,大侠用的GoogleChrome,查看元素,下面的也基本用这个浏

  • 网页中部分非主流代码[通俗易懂]

    网页中部分非主流代码[通俗易懂]一:颜色代码0000000000200000400000600000800000a00000c00000ff…

  • 方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)

    方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频…

  • navicat生成激活码时出错【最新永久激活】2022.02.21[通俗易懂]

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

  • 六大设计原则详解

    六大设计原则详解

发表回复

您的电子邮箱地址不会被公开。

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