
每天记录学习的新知识 :常量池
数值字面量:如 字符串字面量:如
类和接口的全限定名:例如 字段名称和描述符:例如字段 方法名称和描述符:例如方法
发布日期:2021-05-10 05:21:12
浏览次数:22
分类:精选文章
本文共 1179 字,大约阅读时间需要 3 分钟。
简介常量值和常量
什么是常量值?
常量值,又称为字面常量,是指通过数据直接表示的简单且固定值。常量值可以是整型数、实型数、布尔值、字符或字符串等。它们的值在运行时是固定的,且无法被修改。
常量与常量值的区别
常量与常量值的区别在于前者可以通过符号表示,需要在程序中定义并初始化后才能使用。例如,在Java中,常量可以用final
修饰,常量值无法改变。一旦定义,它们的值在程序运行期间保持不变。
Java中的常量池
Java中的常量池(Constant Pool)用于存储两种主要类型的常量:字面量和符号引用量。
字面量
字面量是通过编译期直接生成的值,通常有两种形式:
123
、3.14
或false
。"Hello"
或"Hello World"
。字面量只能作为右值出现,例如右边的表达式int a = 123;
中,123
是字面基数。
符号引用量
符号引用量涉及编译时的常量,主要包括:
com.example.Hello
。public static final String MSG
。public static void main(String[] args)
。符号引用量通常在类文件中存储。
运行时常量池
在JVM中,运行时常量池的特点是动态性。它不只是从类文件中获取常量池内容,还可以在运行时添加新的常量。
内存区域
- Perm Gen区(JDK6):用于存储类常量池。
- 堆区(JDK7和JDK8):用于存储运行时常量池。
动态性
运行时常量池支持动态添加常量。例如,String intern()
方法会将字符串放入字符串常量池中。
字符串常量池
字符串常量池是一个HashSet,主要用于存储字符串实例和字符串引用。它是在运行时动态维护的,惰性加载的。
使用场景
- 使用双引号直接赋值的字符串。
- 使用
intern()
方法生成的字符串引用。 - 其他情况(如
"lift"
+"ing"
)生成的字符串。
适用对象
s1 = "Hello"
和s2 = "Hello"
适用于字符串常量池。s3 = "Hel" + "lo"
也适用,但不会存储完整的字符串。s6 = s5.intern()
适用于字符串引用。
内存区域
- JDK6:存储字符串常量。
- JDK7和JDK8:存储字符串常量和字符串引用。
其他基本类型的常量池
除了字符串,其他基本类型(如整型、浮点型、布尔值)的常量值在JVM中的处理方式类似于常量池,但直接存储在运行时数据区中。
总结
常量池是JVM中的一个重要概念,用于存储编译期和运行期的常量值。常量值和常量的理解对于优化性能和理解高级Java特性(如内存管理)至关重要。通过合理利用常量池,可以提升应用程序的性能和稳定性。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月10日 08时24分28秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue 错误收集
2019-03-12
Java选择排序算法实现
2019-03-12
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2019-03-12
00013.05 字符串比较
2019-03-12
LeetCode: 138. 复制带随机指针的链表(中等)[DFS, 迭代]
2019-03-12
Effective Java 读书笔记
2019-03-12
SpringBoot使用@Email报错误
2019-03-13
Rabbitmq的内存磁盘监控
2019-03-13
访问servlet时弹出文件下载框解决方法
2019-03-13
IDEA-@Slf4j和log标签&@Data(Lombok)无效
2019-03-13
Thymeleaf 生成下标,索引,使用Stat变量
2019-03-13
全局变量初始化顺序的不确定性引发的bug
2019-03-13
ValueError: Unexpected end of file.
2019-03-13
六、登录(二)
2019-03-13
初始微服务---Springcloud发展【第一期】
2019-03-13
RAFT 拜占庭将军 共识算法
2019-03-13
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2019-03-13