文章目录
- 一、字符串常量池
- 二、常量池与运行时常量池
一、字符串常量池 【JAVA|Java中常量池、运行时常量池和字符串常量池的区别】
文章图片
二、常量池与运行时常量池JDK1.8
之前,Hotspot
虚拟机中,字符串常量池存放于方法区的实现永久代(Perm Space)中,JDK1.8
开始,字符串常量池移到了堆中。
字符常量池本质上是一张哈希表,key
为由字符串内容及其长度生成的哈希值,value
为字符串对象在堆中的地址。
public class T01_ConstantPool {
public static void main(String[] args) {}
}
运行上面的程序后,可在项目目录下找到T01_ConstatntPool.class
文件,我们将目录切换到class文件所在目录,运行命令javap -v T01_ConstantPool.class
,在运行结果中可以看到类似下方的Constant pool
信息。
Constant pool:
#1 = Methodref#3.#17// java/lang/Object."":()V
#2 = Class#18// T01_Pool
#3 = Class#19// java/lang/Object
#4 = Utf8
#5 = Utf8()V
#6 = Utf8Code
#7 = Utf8LineNumberTable
#8 = Utf8LocalVariableTable
#9 = Utf8this
#10 = Utf8T01_ConstantPool;
#11 = Utf8main
#12 = Utf8([Ljava/lang/String;
)V
#13 = Utf8args
#14 = Utf8[Ljava/lang/String;
#15 = Utf8SourceFile
#16 = Utf8T01_ConstantPool.java
#17 = NameAndType#4:#5// "":()V
#18 = Utf8T01_Pool
#19 = Utf8java/lang/Object
这个Constant pool
就是常量池,编译时每个类都会产生类似的产量池,我们可以看到,每个常量指向的都是一个符号引用(类/方法/属性的全限定名)。
到了运行时期,Constant pool
常量池中符号引用会被转化为直接引用(类/方法/属性在内存中的真实地址),从而Constant pool
常量池就转变为了运行时常量池。运行时常量池位于方法区(永久代/元空间)。
推荐阅读
- Java|Java整合腾讯云短信发送
- 如何理解Python中if__name__==“__main__”(它是什么意思,有什么用?)
- Python的yield关键字有什么作用(如何理解yield?)
- 使用Python调用外部命令有什么办法(有哪些方式?有实例吗?)
- Python中如何使用全局变量(求实例解释)
- Python中函数的星号和双星号参数是什么(有什么作用?)
- Python如何通过引用传递变量(python有引用传递吗?)
- Python有什么方法将列表分割成大小均匀的块(求使用实例)
- Python如何复制或克隆一个list列表(有哪些方式?求详细解释和实例)