首页 > Java > java教程 > 正文

Java里类的常量为什么放入常量池_Java常量池存储特性解析

php中文网
发布: 2025-12-14 09:01:03
原创
574人浏览过
Java中只有满足编译期常量表达式的字符串字面量、基本类型静态final常量、类/方法/字段符号信息等才进入运行时常量池,用于内存复用、高效解析和动态链接。

java里类的常量为什么放入常量池_java常量池存储特性解析

Java中类的常量(如字符串字面量、基本类型编译期常量)被放入运行时常量池(Runtime Constant Pool),本质是为了实现内存复用、提升性能,并支持JVM对符号引用的解析和动态链接。这不是“所有常量都进常量池”,而是有明确规则的——只有满足特定条件的常量才会在类加载阶段被存入常量池。

哪些常量会进入常量池?

不是所有带final的变量都进常量池,关键看是否满足编译期可确定的常量表达式

  • 字符串字面量(如"hello")一定进常量池;用new String("hello")创建的则不会(对象在堆中)
  • public static final int MAX = 100; 这类基本类型+编译期常量值的静态字段,其值会被直接“内联”进调用处,同时该字面量100也会存入常量池
  • public static final String NAME = "Tom"; 同样进常量池;但public static final String NAME = new String("Tom"); 不会(因为运行期才创建)
  • 类名、方法名、字段名、描述符等符号信息,也作为CONSTANT_Class_info、CONSTANT_NameAndType_info等结构存入常量池,供JVM链接时使用

常量池是“池”,但不是所有常量都共享

常量池是每个类或接口独立拥有的,存储在方法区(JDK 7+ 逻辑上在堆中,JDK 8+ 元空间)。不同类里相同的字符串字面量,在各自常量池中是独立条目;但通过String.intern()可手动将其映射到全局字符串表(String Table),实现跨类共享。

例如:

class A { static final String s = "abc"; }<br>
class B { static final String t = "abc"; }
登录后复制

A和B各自的常量池里都有一个"abc"条目,但它们默认不指向同一个String实例(除非显式调用intern())。

常量池内容在类加载哪个阶段写入?

常量池数据在类加载的“准备”阶段之后、“解析”阶段之中完成初始化:

Zyro AI Background Remover
Zyro AI Background Remover

Zyro推出的AI图片背景移除工具

Zyro AI Background Remover 145
查看详情 Zyro AI Background Remover

立即学习Java免费学习笔记(深入)”;

  • 准备阶段:为静态变量分配内存并设默认值(如0null
  • 解析阶段:把常量池内的符号引用(如类名、方法名)替换为直接引用;此时字符串字面量等实际值也被加载进运行时常量池
  • 注意:静态变量若引用了常量池中的字符串,其赋值动作(如s = "abc")发生在“初始化”阶段,但"abc"本身早已在解析阶段进了常量池

为什么设计常量池?核心作用是什么?

常量池是JVM实现高效链接与运行时优化的基础设施

  • 节省内存:相同字面量只存一份(尤其字符串),避免重复对象
  • 加速解析:方法调用、字段访问等指令只需持有一个常量池索引,比存储完整名称更紧凑
  • 支持动态性:反射、Lambda、invokedynamic等机制依赖常量池中动态生成的引导方法和调用点信息
  • 验证与安全:类文件校验时检查常量池引用是否合法,防止非法跳转或类型混淆

基本上就这些。常量池不是黑盒缓存,而是JVM链接模型的核心枢纽——它让编译后的字节码保持紧凑,又为运行时的灵活解析留出空间。理解它,才能真正看懂类加载、字符串比较、反射调用背后的逻辑。

以上就是Java里类的常量为什么放入常量池_Java常量池存储特性解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号