gpt4 book ai didi

java - 运行时常量池 - 由运行时创建的变量填充?

转载 作者:行者123 更新时间:2023-12-01 20:52:17 25 4
gpt4 key购买 nike

我不确定运行时常量池的一些属性。

运行时常量池,由常量池中的数据填充(来自.class文件,在类加载期间)。但它也由运行时创建的变量填充吗?或者它们在编译期间转换为文字,并存储在常量池中?

例如:

Integer i = new Integer(127);

被视为文字,因为转换为:

Integer i = Integer.valueOf(127);

在编译期间,并存储在常量池中?

如果不是这样工作,运行时常量池是否有任何运行时机制?

第二个问题:我在很多文章中都发现过这样一句话:“every class gets Runtime Constant Pool”,但这是什么意思呢?是否有一个单独的 RCP,其中包含(例如)整数类型的所有应用程序对象,或者每个类是否都有一个单独的 RCP,其中包含该类中出现的所有常量对象? (例如:Person,年龄 = Integer(18),isAdult = Boolean(true))。

最佳答案

首先,没有转换

Integer i = new Integer(127);

Integer i = Integer.valueOf(127);

这些结构完全不同。 new Integer(127) 保证每次评估时都会生成一个新实例,而 Integer.valueOf(127) 则保证每次评估时都会生成相同的实例, as Integer.valueOf 保证 -128 … +127 范围内的所有值。这是由 Integer.valueOf(int) 的实现来处理的,与常量池没有任何关系。当然,它是特定于实现的,但 OpenJDK 实现通过简单地 filling an array with references to these 256 instance the first time, this cache is accessed 来处理这个问题。 .

虽然每个类都有一个 constant pool in its class file 是正确的,说每个类都有一个运行时常量池(单独的)可能会产生误导。这又是一个 JVM 实现细节。虽然可以将每个类常量池 1:1 映射到运行时常量池,但将位于同一解析上下文(即由同一类加载器定义)中的类的常量池合并到一个池中显然是有意义的,因此相同的常量不需要多次解析。不过,从概念上讲,每个类都有其池的运行时表示,即使它们没有以这种幼稚的形式实现。所以“每个类都有一个运行时常量池”这句话并没有错,但并不一定意味着每个类都会有这样的数据结构。

这会影响类、成员、MethodTypeMethodHandleString 实例,这些实例由类的常量池引用,但不影响包装类型例如IntegerBoolean,因为常量池中没有这样的条目。池中的整数值是原始值, boolean 值根本不存在。

这不能与全局 String 池相混淆,该池引用所有 String 实例来获取文字和 intern() 的结果。来电。

关于java - 运行时常量池 - 由运行时创建的变量填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43047852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com