类常量池(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())。

  • 内容:运行时常量池包含类常量池中的所有内容,以及在运行时可能添加的附加常量。

本篇文章来源于微信公众号: 互联网面试小帮手



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-04-27