Java常量池关系图

java 位置 常量池 java的常量池_java

Java常量池

  • Java常量池是Java编译器在编译Java源代码时,为了优化性能和节省空间所创建的一种常量缓存机制。它包含了所有的基本数据类型、字符串常量、符号引用等常量,这些常量都是在编译期被确定下来的,并被存储在.class文件的常量池中。在Java程序运行时,当需要使用这些常量时,就可以直接从常量池中取出,而不需要再进行计算或创建对象,从而提高了程序的运行效率。同时,Java常量池还可以避免重复创建相同的常量,从而减少了内存占用。
  • Java常量池包括两种类型:静态常量池和运行时常量池。

Java静态常量池(class文件常量池)

  • Java静态常量池是指在编译Java源代码时,将其中的字面量和符号引用存储在.class文件中的一段常量区域,它是类加载过程中的一部分,用于存储类、接口、字段和方法的常量数据。
  • 在Java程序运行时,静态常量池的数据会被加载到运行时常量池中使用。

Java运行时常量池

  • Java运行时常量池是Java虚拟机在运行时动态分配的一块内存区域,用于存储编译期间生成的各种字面量和符号引用。
  • Java运行时常量池包含了编译期间生成的各种字面量,如字符串、数字和类、接口的全限定名等,以及符号引用,如类和接口的符号引用、字段和方法的符号引用等。它们都是在编译期间确定的,在运行时被存储在常量池中供程序使用。
  • Java运行时常量池在方法区中分配内存。

Java字符串常量池

  • Java字符串常量池是Java运行时常量池的一部分,用于存储字符串常量。当程序中出现字符串常量时,如果该字符串在常量池中已存在,则直接返回常量池中的引用;否则,在常量池中创建该字符串并返回引用。这样可以避免在堆内存中重复创建相同的字符串,节省内存空间。
  • 在Java中,字符串常量池有两种类型:字面量和调用intern()方法的字符串。
  • 字面量指的是直接使用双引号定义的字符串常量,例如:“hello”。这些字符串常量会在编译期间就被放入常量池中。
  • 调用intern()方法的字符串是在运行期间动态创建的字符串,例如:String s = new String(“hello”).intern()。这些字符串会在运行时被加入常量池中。
  • 字符串常量池在JDK1.7后由在方法区分配内存改为在堆中分配内存。