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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QT安装具体图解

    QT安装具体图解文章目录QT安装包下载Qt安装QT安装包下载我下载的版本是最新的5.14.2下载链接在下面,https://download.qt.io/archive/qt/5.14/5.14.2/找到Windows版本下载(ps:如果需要下载其他版本的话点击父目录就可以去选择不同版本了,建议5.9以上。)(ps:Linux上的Qt安装日后会更新,见谅)Qt安装1.双击下载好的安装包,出现界面点击next2.根据个人情况选择填写信息,有账号就登陆,没有就注册一个(注意:注册时候的密码需要英文大写,

    2022年5月17日
    50
  • Java3大框架学习,今年最受欢迎的后端框架

    Java3大框架学习,今年最受欢迎的后端框架作为20多年来最流行的编程语言,Java拥有一整套后端框架,但它们的可靠性和多功能性差异很大。当今最流行的Java后端框架是:SpringFramework Struts HibernateJava后端框架的比较:框架 优势 弱点 SpringFramework 1.许多现成的组件对Web应用程序有帮助2.DI和IoC创建灵活的配置3.易于暴露RESTful服务 1.许多依赖2.丰富的选择可能导致混乱3.学习曲线,因为它可以做很多..

    2022年5月12日
    55
  • C语言图书管理系统设计报告「建议收藏」

    C语言图书管理系统设计报告「建议收藏」源代码:https://blog.csdn.net/k_young1997/article/details/73480766XXXX大学C语言课程设计报告题目图书管理系统设计专业班级XXXX级计算机科学与技术本科X班组别计科第…

    2022年10月16日
    5
  • HT for Web嵌入QtWebKit的客户端解决方案

    HT for Web嵌入QtWebKit的客户端解决方案

    2021年9月2日
    71
  • 【CentOS 7笔记】 文档查看cat_more_less_head_tail

    【CentOS 7笔记】 文档查看cat_more_less_head_tail

    2021年6月7日
    107
  • 基于Java swing+mysql+eclipse的【水电费管理系统】

    基于Java swing+mysql+eclipse的【水电费管理系统】本项目为前几天收费帮学妹做的一个项目,Javaswing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考。CSDN9.9赞助下载:https://download.csdn.net/download/weixin_44893902/20545860白嫖:加QQ68872185一、效果演示主要功能:普通用户:用户用水用电查询(根据时间查询、导出Excel)管理员用户:用户信息管理>>平台用户信息查询(修改信.

    2022年6月17日
    22

发表回复

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

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