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

字符串常量池概述[通俗易懂]字符串常量池概述常量池表(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对象

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

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

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

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

(0)


相关推荐

  • 一元线性回归-最小二乘法推导过程

    一元线性回归-最小二乘法推导过程设一元线性回归方程为,数据样本点为,要想使这n个样本点落在一元线性回归方程附近,不妨设误差为,使得没一个样本点落在一元线性回归方程上,因此有恒成立,所以回归直线应满足的条件是:实际值与回归估计值之间的误差平方和最小,即:此时令,原问题就转换成求解二元函数极小值问题,分别对求偏导:令上两式等于零,即最终求出两个数值,一元线性回归方程也就拟合出来了。…

  • eclipse中配置jdk

    eclipse中配置jdkwindow->preference->java->installjres->add->standardvm->设置好相应的jrehomeeclipse的实验版本:Version:4.3.0.v20130605-20001、点击eclipse菜单栏的window下拉菜单选中preference2、点击…

  • 数据库置疑修复工具未找到数据文件_sql2008数据库置疑

    数据库置疑修复工具未找到数据文件_sql2008数据库置疑本工具基于SQLServer产品设计问题,常因断电、出错、丢失文件等原因引起数据错误,此现象大部分伙伴都曾碰到且不易修复,本工具通过智能识别以快速处理置疑等数据库异常状态目前支持数据库版本有MSDE\SQL2000\SQL2005\SQL2008,适用于公司所有产品线,且针对T3|T6|T+无缝完美兼容文件:n459.com/f/25127180-479733688-1b11c9(访问密码:551685)以下内容无关:—————————————-

  • journalctl基本介绍

    journalctl基本介绍journalctl基础用法1、查看所有日志(默认显示本次启动的所有日志)[root@localhost~]#journalctl查看本次启动的所有日志也可以使用[root@localhost~]#journalctl-b2、查看内核日志[root@localhost~]#journalctl-k3、查看指定时间的日志通过–since和–until选项,可以过滤任意时间限制,显示指定条件之前、之后或之间的日志[root@localhost~]#jour

  • 垂直同步、三重缓冲、freesync

    垂直同步、三重缓冲、freesync一、垂直同步60Hz显示器,开启垂直同步后,就会锁60了;作用:1、解决画面撕裂现象,不会出现缓冲没画完被复写的情况;2、解决错帧现象;游戏更流畅;3、强制每帧间隔完全一样,这样因为帧生成时间不平滑导致的不流畅也会解决弊端:鼠标反馈,移动鼠标,电脑收到消息把移动鼠标输出给显卡,显卡收到后把鼠标移动画面输出给显示器,所有请求不会被延后,延迟只是电路延迟。但开启垂直同步,显卡绘制完后缓冲后,显示器还没有显示器完前缓冲,显卡等着,鼠标移动指令和显卡一起等着,直到显示…

  • pcep协议什么意思_PCEP – magnate3 – 博客园[通俗易懂]

    pcep协议什么意思_PCEP – magnate3 – 博客园[通俗易懂]PCEP是什么PCEP的全称是PathComputationElementCommunicationProtocol,直译过来就是路径计算单元通信协议。简单概括就是一个通信协议,基于TCP的应用层协议,具体用来干什么,会在下面逐步介绍。PCEP的发展曲线PCEP最初是想将路由器上的CSPF功能抽取出来,实现一个集中算路的能力,最初的时候是不温不火的;后面随着SDN大热,PCEP由于具备下发…

发表回复

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

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