类常量池(Class Constant Pool)
-
属于 Java 字节码文件(
.class文件)的一部分。 -
在编译期间创建,包含该类的所有编译时常量。
-
这些常量包括字符串字面量、数字字面量、类名、方法名、字段名等。
-
类常量池中的符号引用(类名、方法名等)需要在类加载时解析。
运行时常量池(Runtime Constant Pool)
-
由 Java 虚拟机(JVM)在类加载时创建。
-
属于加载到 JVM 中的类或接口的元数据。
-
包含类常量池中的所有内容,以及在运行时可能添加的附加常量。
-
附加常量可能包括通过 intern()方法内部化的字符串、动态生成的类或方法等。
举例说明
考虑以下 Java 类:
public class MyClass {public static final String MESSAGE = "Hello, World!";}
-
类常量池:在编译此类时,编译器会在类常量池中创建以下条目:
-
一个字符串常量,值为 “Hello, World!”
-
一个对String类的符号引用
-
运行时常量池:当此类由 JVM 加载时,JVM 会创建运行时常量池:
-
最初,它包含类常量池中的所有条目。
-
如果在运行时执行以下代码,运行时常量池将添加一个新的条目:
String internedMessage = MESSAGE.intern();
-
intern()方法将字符串的副本替换为常量池中的引用,以节省内存。
主要区别
-
创建时机:类常量池在编译时创建,而运行时常量池在类加载时创建。
-
所属范围:类常量池属于 .class 文件,而运行时常量池属于加载到 JVM 中的类或接口。
-
动态性:类常量池是静态的,而运行时常量池可以在运行时进行修改(例如,通过 intern())。
-
内容:运行时常量池包含类常量池中的所有内容,以及在运行时可能添加的附加常量。
本篇文章来源于微信公众号: 互联网面试小帮手
微信扫描下方的二维码阅读本文

Comments NOTHING