字符串常量池概述[通俗易懂]

字符串常量池概述[通俗易懂]字符串常量池概述常量池表(Constant_Pooltable)Class文件中存储所有常量(包括字符串)的table。这是Class文件中的内容,还不是运行时的内容,不要理解它是个池子,其实就是Class文件中的字节码指令。运行时常量池(RuntimeConstantPool)JVM内存中方法区的一部分,这是运行时的内容。这部分内容(绝大部分)是随着JVM运行时候,从常量池转化而来,每个Class对应一个运行时常量池。上一句中说绝大部分是因为:除了Class中常量池内容,还可能包括

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

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

字符串常量池概述

常量池表(Constant_Pool table)

Class文件中存储所有常量(包括字符串)的table。这是Class文件中的内容,还不是运行时的内容,不要理解它是个池子,其实就是Class文件中的字节码指令。

运行时常量池(Runtime Constant Pool)

JVM内存中方法区的一部分,这是运行时的内容。这部分内容(绝大部分)是随着JVM运行时候,从常量池转化而来,每个Class对应一个运行时常量池。
上一句中说绝大部分是因为:除了 Class中常量池内容,还可能包括动态生成并加入这里的内容。

字符串常量池(String Pool)

字符串常量池与运行时常量池不是一个概念:

  1. String Pool 是JVM 实例全局共享的全局只有一个,而Runtime Constant Pool 每个类都有一个。
  2. String Pool 只记录字符串对象,而Runtime Constant Pool 记录各种对象。
  3. JVM规范要求进入这里的String 实例叫“被驻留的字符串 – interned string”,各个JVM 可以有不同的实现,HotSpot 是设置了一个哈希表 – StringTable 来引用堆中的字符串实例,被引用就是被驻留。
  4. 字符串池在JDK 1.7 之后存在于Heap 堆中,旧版存在于方法区中

【亨元模式】
其实字符串常量池这个问题涉及到一个设计模式,叫“享元模式”,顾名思义 – – – > 共享元素模式
也就是说:一个系统中如果有多处用到了相同的一个元素,那么我们应该只存储一份此元素,而让所有地方都引用这一个元素。
Java中String部分就是根据享元模式设计的,而那个存储元素的地方就叫做“字符串常量池 – String Pool”
【详细分析】
首先, 10 和 “hello” 会在经过javac(或者其他编译器)编译过后变为Class文件中constant_pool table 的内容,当我们的程序运行时,也就是说JVM运行时,每个Class constant_pool table 中的内容会被加载到JVM内存中的方法区中各自Class的 Runtime Constant Pool.
一个没有被String Pool包含的Runtime Constant Pool中的字符串(这里是”hello”)会被加入到
String Pool中(HosSpot使用hashtable引用方式),步骤如下:

  1. 在Java Heap(堆)中根据”hello”字面量create一个字符串对象
  2. 将字面量”hello”与字符串对象的引用在hashtable中关联起来 键 – 值
    形式是:“hello” = 对象的引用地址。
    另外来说,当一个新的字符串出现在Runtime Constant Pool中时怎么判断需不需要在Java Heap中创建新对象呢?
    是这样: 会先去根据equals来比较Runtime Constant Pool中的这个字符串是否和String Pool中某
    一个是相等的(也就是找是否已经存在),如果有那么就不创建,直接通过哈希表键值找到对应地址,使用其引用
    如此,就实现了享元模式,提高的内存利用效率。
    举例:
int x = 10; String y = "hello"; 

使用

String s = new String("hello");

会创建几个对象
答:会创建2个对象
首先,出现了字面量”hello”,那么去String Pool中查找是否有相同字符串存在,因为程序就这一行 代码所以肯定没有,那么就在Java Heap中用字面量”hello”首先创建1个String对象。 接着,new String(“hello”),关键字new又在Java Heap中创建了1个对象,然后调用接收String 参数的构造器进行了初始化。最终s的引用是这个String对象

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lmdb转换「建议收藏」

    lmdb转换「建议收藏」一、LMDB介绍:lmdb数据库LMDB全称为LightningMemory-MappedDatabase,就是非常快的内存映射型数据库,LMDB使用内存映射文件,可以提供更好的输入/输出性能,对于用于神经网络的大型数据集(比如ImageNet),可以将其存储在LMDB中。LMDB属于key-value数据库,而不是关系型数据库(比如MySQL),LMDB提供key-value存储,其中每个键值对都是我们数据集中的一个样本。LMDB的主要作用是提供数据管理,可以将各种

    2022年9月29日
    5
  • Spring整合Sharding-JDBC分库分表详情

    Spring整合Sharding-JDBC分库分表详情Spring整合Sharding-JDBC分库分表详情一、概述最初线上系统的业务量不是很大,业务数据量并不大,比如说单库的数据量在百万级别以下(事实上千万级别以下都还能支撑),那么MySQL的单库即可完成任何增/删/改/查的业务操作。随着业务的发展,单个DB中保存的数据量(用户、订单、计费明细和权限规则等数据)呈现指数级增长,那么各种业务处理操作都会面临单DB的IO读写瓶颈带来的性能问题。S…

    2022年6月14日
    27
  • pytorch的安装及其在pycharm中的使用「建议收藏」

    pytorch的安装及其在pycharm中的使用「建议收藏」1.首先配置Anaconda虚拟环境在AnacondaPrompt中输入condacreate-npytorchpython==3.72.在该环境中安装pytorch因为前面已经安装了cuda10.0.130和cudnn,安装与之匹配的pytorch版本,官网中寻找,但是官网的貌似不太对,最后看的是这个回答pipinstalltorch==1.2.0torchvision==0.4.0-fhttps://download.pytorch.org/whl/torch_stab

    2022年8月25日
    8
  • 统计机器学习-Multinoulli分布、多项式分布

    统计机器学习-Multinoulli分布、多项式分布Multinoulli分布(多元伯努利分布):模型:       Mu(p)Mu(p)Mu(p)       d面????获得每一面的概率: p1,p2,…,pdp_1,p_2,…,p_dp1​,p2​,…,pd​分布函数:p(x∣p)=∏k=1dpkxkp(x|p)=\prod_{k=1}^dp_k^{x_k}p(x∣p)=k=1∏d​pkxk​​E(X)=pE(X)=pE(…

    2022年8月31日
    4
  • typora文章同步(跨平台)

    typora文章同步(跨平台)typora实现备份个人博客一、图片上传PicGo有提供默认的图床,可以直接使用,但是有上传的限制,有特定要求的可以自己配置github图床。1.配置github图床利用github搭建图床2.安装PicGo下载链接windows选择exe结尾文件即可mac选择dmg为后缀的文件安装的时候一路next即可。3.在picGo中配置使用github图床4.picGo设置开启时间戳重名防止图片上传出错ps:我当时一直传输失败,修改代理,重新生成厂库,toke

    2022年5月19日
    132
  • 代价函数总结[通俗易懂]

    代价函数总结[通俗易懂]代价函数是学习模型优化时的目标函数或者准则,通过最小化代价函数来优化模型。到目前为止,接触了一些机器学习算法,但是他们使用的代价函数不一定是一样的,由于,在现实的使用中,通常代价函数都需要自己来确定,所以,这里总结一下,代价函数都有哪些形式,尽量揣测一下,这样使用的原因。1.均方差代价函数这个是Andrewng的机器学习课程里面看到的损失函数,在线性回归模型里面提出来的。表示模型所预测(假设

    2022年4月29日
    44

发表回复

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

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