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


相关推荐

  • esxi 嵌入式vCenter 6.5 不用设置DNS安装部署说明

    esxi 嵌入式vCenter 6.5 不用设置DNS安装部署说明

    2021年6月6日
    152
  • MySQL数据库分区分表配置以及原理、特点、概念、区别详解「建议收藏」

    MySQL数据库分区分表配置以及原理、特点、概念、区别详解「建议收藏」一、为什么要分表和分区?我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。当出现这种情况时,我们可以考虑…

    2022年5月22日
    39
  • BP神经网络基础算法

    BP神经网络基础算法

    2021年6月5日
    133
  • MFC进度条控件颜色的设置

    MFC进度条控件颜色的设置平台:VS2013内容介绍:创建进度条控件ProgressControl控件并给它颜色的设置。在VC6.0里头可以直接用SendMessage函数就可以设置颜色了,但是在VS里头是不行的,要对进度条进行重绘。第一步:创建一个基于对话框的工程,并在对话框中拖动一个进度条控件,把属性smooth设置为True。Vertical属性是False的话就是水平。如果是True的话就是垂直增长的。第二步:1…

    2022年7月12日
    51
  • java输入的方法_java输入一个数

    java输入的方法_java输入一个数java输入语句的方法:1、输入单个字符【charc=(char)System.in.read()】;2、输入整数或者字符串【inta=cin.nextInt()】;3、可以用BufferedReader类输入。java输入语句的方法:如果你要进行输入,请一定加上两个包importjava.util.*;importjava.io.*;请看下面例子用于输入单个字符importjava.i…

    2022年9月21日
    5
  • 正则表达式匹配_正则表达式匹配字符串长度

    正则表达式匹配_正则表达式匹配字符串长度题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意

    2022年8月2日
    10

发表回复

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

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