java long常量池_Java-常量池

article/2025/9/23 23:45:09

Java-常量池

常量池是类文件中最复杂的数据结构。对于JVM字节码来说,如果操作数是很常用的数字,比如 0,这些操作数是内嵌到字节码中的。如果是字符串常量和较大的整数等,Class文件则会把这些操作数存储到常量池中,当使用这些操作数时,会根据常量池的索引位置来查找。

常量池可以比喻为class文件里的资源仓库,它是Class文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,他还是在Class文件中第一个出现的表类型数据项目。

常量池的结构:

struct {

u2                constant_pool_count;

cp_info         constant_pool[ constant_pool_count-1 ];

}

(1) 常量池大小(cp_info_count): 常量池是Class文件中第一个出现的变长结构。既然是池就有大小,所以在常量池的入口需要放置一项u2(两个字节)类型的数据,代表常量池容量计数值。与Java中语言习惯不同,这容量是从1开始的而不是从0开始的。0属于保留索引,可供特殊情况使用。(Class文件只有常量池的容量计数是从1开始的,对于其他集合类型,包括接口索引集合,字段表集合,方法表集合等的容量计数都与一般习惯相同,是从0开始的)。

(2)常量池项(cp_info)集合: 最多包含 n-1 个元素。因为long和double类型的常量会占用两个索引位置,如果常量池包含了这两种类型的元素,实际的常量池的元素个数比 n-1 要小。

Java虚拟机目前一共定义了14中常量项tag类型,如下表:

类型tag(标志)描述CONSTANT_Utf8_info1UTF-8编码的字符串

CONSTANT_Integer_info3整形字面量

CONSTANT_Float_info4浮点型字面量

CONSTANT_Long_info5长整型字面量

CONSTANT_Double_info6双精度浮点型字面量

CONSTANT_Class_info7类或接口的符号引用

CONSTANT_String_info8字符串类型字面量

CONSTANT_Fieldref_info9字段的符号引用

CONSTANT_Methodref_info10类中方法的符号引用

CONSTANT_InterfaceMethodref_info11接口中方法的符号引用

CONSTANT_NameAndType_info12字段或方法的部分符号引用

CONSTANT_MethodHandle_info15表示方法句柄

CONSTANT_MethodType_info16表示方法类型

CONSTANT_Dynamic_info17表示一个动态计算常量

1、 boolean,byte,short ,char 和 float 类型

Java语言规范定义了boolean,byte,short 和 char 类型的变量在常量池中都会被当作 int 来处理。int 和 float 都是用 4 个字节来表示具体的数值常量。

接下来测试一下:( 此处在 IDEA里面下载插件jclassbil之后,点击View——>Show Bytecode With Jclassbil 可查看 )

1.1 Boolean

public class HelloWorld {

public final boolean bool = true;

}

28fab31b20a5a668a0ac4965dfaf80cf.png

1.2 Byte

public class HelloWorld {

public final byte aByte = Byte.MAX_VALUE;

}

b47c019235be073ba74b094410de26e1.png

对于short,char, int 和 float 同样可以测试,此处不再赘述。

2、long 和 double 类型

long 和 double 类型的常量都用8个字节表示具体的常量数值( 分为 high_bytes 和 low_bytes )。接下来测试一下:

2.1 long

public class HelloWorld {

public final long aLong = Long.MAX_VALUE;

}

fb2de826b783949d744f60386329cb46.png

2.2 double

public class HelloWorld {

public final double aDouble = Double.MAX_VALUE;

}

afa85ff3d852a3f2ac1b743f89f5ece6.png

可见CONSTANT_Long_info 和 CONSTANT_Double_info 都是占用两个常量池位置(例子中的[09] 和 [10])。

3、CONSTANT_Utf8_info

(1) 对于传统的ASCII编码字符 ( 0x0001~0x007F ),UTF-8 用一个字节来表示,如下所示。

0000 0001 ~ 0000 007F --> 0xxxxxxx

因此英文字母的ASCII编码和UTF-8编码的结果一样。

(2) 对于0080 ~ 07FF 范围的字符,UTF-8用2个字节来表示,如下图所示。

0000 0080 ~ 0000 07FF --> 110xxxxx 10xxxxxx

程序遇到这种字符的时候,会把第一个字节的110和第二个字节的10去掉,再把剩下的bit组成新的两字节数据。

(3) 对于 0000 0800 ~ 0000 FFFF 范围的字符,UTF-8 用 3 个字节表示,如下所示。

0000 0800 ~ 0000 FFFF --> 1110xxxx 10xxxxxx 10xxxxxx

程序遇到这种字符的时候,会把第一个字节的1110,第二个字节和第三字节的10去掉,再把剩下的bit组成新的3字节数据。

(4) 对于 0001 0000 ~ 0010 FFFF 范围的字符,UTF-8 用4个字节表示,如下所示。

0001 0000-0010 FFFF --> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

程序遇到这种字符的时候,会把第一个字节的1110以及第二个,第三,第四字节中的10去掉,再把剩下的bit组成新的4字节数据。

4、CONSTANT_String_info

CONSTANT_String_info用来表示java.lang.String类型的常量对象。

CONSTANT_Utf8_info 存储了字符串真正的内容,而CONSTANT_String_info并不包括字符串的内容,仅仅包含一个指向常量池中的CONSTANT_Utf8_info常量类型的索引。

public class HelloWorld {

public final String str = "Hello JVM";

}

2b6114d630ec85b202b9129423b034a4.png

66b5102c9d35a49ccc42bed4b2fc177d.png

可看到[07]处是CONSTANT_String_info,存储了一个索引,指向[08],[08]处是CONSTANT_Utf8_info, 存储的才是字符串 Hello JVM。


http://chatgpt.dhexx.cn/article/qZQvXuDy.shtml

相关文章

Java常量池原理以及垃圾回收

Java常量池 常量池:用于存放编译期间生成的各种字面量和符号引用 字面量:由字母数字等构成的字符串或数值常量,如int a 1中 1就是字面量 符号引用:编译原理中的概念;是相对直接引用来说的,主要包括三类常…

Java 常量池详解(一)字符串常量池

在Java的内存分配中,总共3种常量池: Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池 1.字符串常量池(String Constant Pool) 在JDK1.7之前运行时常量池逻辑包含…

Java常量池储存什么_JAVA常量池中存储的常量是什么

展开全部 我当初也存在这样一个疑问,下面我把e69da5e887aa3231313335323631343130323136353331333262356165当初所搜集的一些资料以及自己的理解贴出来给你看看(比较多,需要耐心点看,呵呵): 理解Java常量池 JVM运行时数据区的内存…

深度剖析Java常量池

Class常量池 class常量池可以理解为是Class文件中的资源仓库。Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译期生成的各种字面量和符号引用。 一个Class文件的16进制大体结构如…

Java常量池

Java常量池 一.相关知识 1.何为常量 第一种常量:是一个值,我们将这个值本身称为常量。比如: 整型常量:1024 实型常量:1.024 字符常量:g c w 字符串常量:"gcw" 逻辑常量:t…

Java 常量池

常量池分为 Class 常量池常量池、运行时常量池、字符串常量池。 1、 Class 常量池常量池(静态常量池) Java 文件被编译成 Class 文件,Class 文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是 Class 常量池&am…

JAVA常量池,一篇文章就足够入门了。(含图解)

前言 一直在《深入理解JVM》对常量池只有一个浅薄的了解,之前也遇到过这种题目,今天还是要挑出来进行一次全方位的了解。 常量池分类 常量池大体可以分为:静态常量池,运行时常量池。 静态常量池 存在于class文件中&#xff0c…

基于Elman神经网络的刀具剩余使用寿命预测(初学者+matlab代码实现)

1.Elman介绍 Elman神经网络是 J. L. Elman于1990年首先针对语音处理问题而提出来的,是一种典型的局部回归网络( global feed forward local recurrent)。Elman网络可以看作是一个具有局部记忆单元和局部反馈连接的递归神经网络 它的主要结构是前馈连接, 包括输入层、…

通过模拟退火改进的Elman神经网络(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 神经网络是一个庞大的体系和概念,根据处理信息的不同方式来区分不同的network。比如根据处理信息结果的传递方向&am…

基于遗传算法优化的Elman神经网络数据预测-附代码

基于遗传算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于遗传算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于遗传优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

【预测模型-ELAMN预测】基于海鸥算法优化ELMAN神经网络实现数据回归预测

1 简介 风能,作为一种重要,有潜力,无污染,可再生、可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐。近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世界各国纷纷大力发展风能资源。然而,在实际操作中,风能固有的波动性和间歇…

MATLAB神经网络应用之Elman神经网络

Elman神经网络通常由输入层、隐含层和输出层构成,它存在从隐含层的输出到隐含层输入的反馈。这种反馈连接的结构使得被训练后不仅能识别和产生空域模式,还能够识别和产生时域模式,在此只介绍创建Elman网络的newelm函数,该函数用于…

基于粒子群算法优化的Elman神经网络数据预测-附代码

基于粒子群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于粒子群算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于粒子群优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

elman神经网络的实现

在看文章时,一篇文章提到了使用elman神经网络来对癫痫病人的脑电信号与正常人的脑电信号进行区分,并且取得了较好的分类结果。于是就想自己写一个elman神经网络demo看看效果。 elman神经网络和感知机的差别通过下面的图片可以很明显的看出哪里不一样&am…

【预测模型-ELAMN预测】基于遗传算法优化ELMAN神经网络实现数据回归预测matlab代码

1 简介 风能,作为一种重要,有潜力,无污染,可再生、可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐。近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世界各国纷纷大力发展风能资源。然而,在实际操作中,风能固有的波动性和间歇…

【预测模型】基于Elman神经网络预测电力负荷matlab代码

​1 简介 为提高甘肃电网负荷预测精度,提出了一种基于神经网络的负荷预测方法.针对甘肃电力系统负荷数据的非线性和动态特性,在多层前向BP网络中引入特殊关联层,形成有"记忆"能力的Elman神经网络,从而可以映射系统的非线性和动态特性.在网络训练算法中,采用自适应学…

粒子群算法优化BP和Elman神经网络-matlab源码

粒子群优化算法是一种智能优化算法,又称微粒群算法,它通过模拟自然界鸟群捕食和鱼群捕食的过程。通过群体中的协作寻找到问题的全局最优解。 收敛性的数学证明帮助了PSO的发展和应用,但此内分析具有很大的局限性。为PSO加入正交学习后&#…

基于鲸鱼算法优化的Elman神经网络数据预测-附代码

基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于鲸鱼优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

基于小波Elman神经网络的短期风电功率预测

风力发电在全球范围内快速发展,装机容量逐年增加,截止2013 年底,中国风电新增装机容量约 16.1GW,较 2012 年的 12.96GW 大幅提高了 24%,中国风电累计装机已超过 90GW。 风力发电并网运行是实现大规模风能发利用的有效途径。但是与常规能源不…

基于灰狼算法优化的Elman神经网络数据预测

基于灰狼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于灰狼算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于灰狼优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…