JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]

JDK1.8关于运行时常量池, 字符串常量池的要点[通俗易懂]网上关于jdk1.8的各种实验,结论鱼龙混杂,很多都相矛盾,网上有的实验也被后人测试出了不同的结果很多都分辨不了真假,这里记录一下网络上正确的结论,欢迎指正!首先自行区分运行时常量池与Class文件常量池(静态常量池)的概念,JVM内存模型,方法区与永久代的区别,有些在我的其他博客有介绍,连接在文尾在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在…

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

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

网上关于jdk 1.8的各种实验,  结论鱼龙混杂 , 很多都相矛盾,网上有的实验也被后人测试出了不同的结果

很多都分辨不了真假, 这里记录一下网络上正确的结论, 欢迎指正!

首先自行区分运行时常量池Class文件常量池(静态常量池)的概念, JVM内存模型 ,方法区与永久代的区别, 有些在我的其他博客有介绍,  连接在文尾

 

 JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代

JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代

JDK1.8 hotspot移除了永久代元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) 

 

  • 对于直接做+运算的两个字符串(字面量)常量,并不会放入字符串常量池中,而是直接把运算后的结果放入字符串常量池中
    (String s = “abc”+ “def”, 会直接生成“abcdef”字符串常量  而不把 “abc” “def”放进常量池) 
  • 对于先声明的字符串字面量常量,会放入字符串常量池,但是若使用字面量的引用进行运算就不会把运算后的结果放入字符串常量池中了
    (String s = new String(“abc”) + new String(“def”),在构造过程中不会生成“abcdef”字符串常量) 
  • 总结一下就是JVM会对字符串常量的运算进行优化,未声明的,只放结果;已经声明的,只放声明
  • 常量池中同时存在字符串常量和字符串引用。直接赋值和用字符串调用String构造函数都可能导致常量池中生成字符串常量;而intern()方法会尝试将堆中对象的引用放入常量池

  • String str1 = “a”;
    String str2 = “b”;
    String str4 = str1 + str2;
    //该语句只在堆中生成一个对象(str4)
    这句被Java编译器做了优化, 实际上使用StringBuilder实现的(不在堆里生成str1和str2对象)

  • String str5 = new String(“ab”);(字符串常量池中不存在”ab”时)在字符换常量池中创建”ab”对象,在堆中生成了一个对象str5, str5指向堆上new的对象,而str5内部的char value[]则指向常量池中的char value[]
    关于这个问题可以参考这篇博客:new String()究竟创建几个对象?

附上自己相关的几篇博客:

永久代->元空间  https://blog.csdn.net/q5706503/article/details/84621210

string.intern   https://blog.csdn.net/q5706503/article/details/84586219

JVM内存空间模型  https://blog.csdn.net/q5706503/article/details/84614158

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

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

(0)
上一篇 2022年7月28日 上午6:16
下一篇 2022年7月28日 上午6:36


相关推荐

  • 学生模式 在华为EMUI9.0上改成 健康使用手机背后的原因?

    学生模式 在华为EMUI9.0上改成 健康使用手机背后的原因?生活中,孩子用手机搜题、看剧、查资料、玩游戏很常见,监护人的合理引导是关键,EMUI9.0健康使用手机,是上一代【学生模式】的升级版。最大的区别是【学生模式】是让孩子在预设的时间段使用【健康使用手机】更注重于时间的平衡安排,限制手机或应用的可用时长通过合理引导加控制,让孩子健康享受科技的乐趣华为手机学生模式改成健康使用手机背后的原因?我想,EMUI9.0倡导的质享生活,就是管理好你的…

    2022年6月8日
    76
  • C语言获得数组长度的函数

    C语言获得数组长度的函数1 c 语言中 定义数组后可以用 sizeof 命令获得数组的长度 可容纳元素个数 例如 doublea 1 2 3 4 intlength length sizeof a sizeof a 0 数组占内存总空间 除以单个元素占内存空间大小 printf lengthofa d length 输出 lengthofa 42 但

    2026年3月17日
    3
  • 如何链接外部JavaScript文件

    如何链接外部JavaScript文件在本教程中 我们向您展示如何将外部 JavaScript 文件 文件扩展名以 js 结尾 链接到网页 注意在 HTML 中 您可以将 JavaScript 嵌入网页或外部 JavaScript 文件中 也可以同时实现两种方式 1 外部 JavaScript 文件创建一个带有 js 文件扩展名的新文件 并将 JavaScript 代码放入其中 就是这样 您刚刚创建了一个外部 JavaScrip

    2026年3月19日
    3
  • css动画和js动画的差异_css过渡和动画的区别

    css动画和js动画的差异_css过渡和动画的区别在工作中,经常会写点动画效果,常用的方式有CSS动画还有JS动画,根据项目的需求,采用的方案各不相同,但是两者实现的性能分析没有进行对比。总结网上相关资料,在这里简单整理下本文主要讲以下这些内容1、浏览器渲染流程2、回流和重绘3、CSS动画4、JS动画两者对比????1.浏览器的渲染流程渲染流程主要有4个步骤解析HTML生成DOM树解析CSS样式生成CSSOM树,CSSOM树与DOM树结合生成Rendertree布局RenderTree对每个节点进

    2022年10月15日
    4
  • navicat15手动激活码【2021.7最新】

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

    2022年3月21日
    535
  • 别再跟风“养虾”了:OpenClaw 实战课,帮你把 AI Agent 从概念变成生产力

    别再跟风“养虾”了:OpenClaw 实战课,帮你把 AI Agent 从概念变成生产力

    2026年3月12日
    4

发表回复

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

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