Java 常量池相关内容
Java 常量池概念分类:静态常量池、动态常量池、字符串常量池(由于jdk1.7之后字符串常量池从运行时常量池分离到堆中)
静态常量池
- class 文件中
- CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用
运行时常量池
-
jvm 方法区(类型信息、字段方法、符号引用) + 堆(字符串常量池、静态变量)
-
静态常量池的内容将在类加载后进入方法区的运行时常量池中存放
-
运行时常量池是每个类都有一个
字符串常量池
堆中,1.7之后不属于运行时常量池,每个 jvm 只有一个
字面量 何时进入常量池?
new Strin g(“abc”) 创建了几个对象?
StringTable :字符串常量池的实现结构
- 底层 HashTable ,数组+链表
- key : 字面量"abc"中的驻留字符 abc
- value:
- 若该 key 在池中有对象,则 value 为池中对象的物理地址
- 若该 key 的 value 是堆中对象的地址引用
str.intern()方法
- 若池中有,则返回池中的地址,若无,则说明 str 是堆中对象,将 (str :str 的堆中地址)加入 StringTable 后,返回池中地址。