Java常量池的三驾马车:全面解析Class、运行期与字符串常量池

常量池是JVM中用来存储各种字面量和符号引用的表结构,在class文件和运行时都发挥着关键作用 。常见的三种是Class文件常量池、运行时常量池和字符串常量池

一、什么是常量池?

常量池是Java中存储固定数据的"共享资源库" ,相当于一个存放常量的公共仓库 。它的核心作用是复用重复数据,减少内存占用。Java中有三种常量池协同工作:

二、三种常量池详解

1️⃣ 类文件常量池(菜谱材料单)

  • 位置:.class文件中
  • 内容:存放源码中写死的字面量 (如数字100、字符串"Hello")和符号引用(类和接口的全限定名、字段名和描述符、方法名和描述符)
  • 特点:静态存储,类似做菜前准备的原料清单

示例:

java 复制代码
String s1 = "Java";
int num = 100;

2️⃣ 运行时常量池(动态调料台)

  • 位置:方法区(元空间)
  • 工作阶段:类加载时创建
  • 特点:将Class文件常量池静态数据转为运行时可用数据,可动态添加新常量,每个类都有自己的运行时常量池,支持动态解析

内存变化示意图: .class文件 → 类加载器 → 方法区(动态生成运行时常量池)

3️⃣ 字符串常量池(共享字条板)

  • 位置:JDK1.7后存放在堆内存
  • 特点:专门存放String对象,实现字符串重用机制,采用享元模式实现复用实现采用HashTable的数据结构,保证字符串的唯一性
  • 工作机制: new String("ABC") → 堆中创建新对象

    "ABC" → 先查池,存在则复用,不存在则新建

运行时常量池演进变化

JDK内存模型进化史:三张图看懂方法区实现变革

三、三者关系流程图

四、实战案例对比

java 复制代码
String a = "Hello";  // 从字符串常量池取
String b = new String("Hello"); // 强制新建对象

System.out.println(a == b); // false(内存地址不同)
System.out.println(a.equals(b)); // true(值相同)

五、记忆技巧

  1. 文件常量池:静态的纸质清单
  2. 运行时常量池:动态的电子菜单
  3. 字符串常量池:共享的食材仓库
  4. 特殊记忆点:字符串比较用equals(),==比较内存地址

理解常量池能帮助我们:

  • ✓ 优化内存使用
  • ✓ 避免重复创建对象
  • ✓ 深入理解字符串处理机制
  • ✓ 提升代码性能调优能力

下次遇到String内存问题时,记得先检查是否合理利用了字符串常量池的特性!

相关推荐
RANCE_atttackkk24 分钟前
Springboot+langchain4j的RAG检索增强生成
java·开发语言·spring boot·后端·spring·ai·ai编程
hello 早上好33 分钟前
03_JVM(Java Virtual Machine)的生命周期
java·开发语言·jvm
夕除1 小时前
js--7
java
布谷歌1 小时前
面试题整理
java·开发语言
2301_790300961 小时前
数据分析与科学计算
jvm·数据库·python
爬山算法1 小时前
Hibernate(74)如何在CQRS架构中使用Hibernate?
java·架构·hibernate
jjjava2.01 小时前
深入解析Set与Map的奥秘
java·开发语言
白宇横流学长1 小时前
基于Java的火车票订票系统的设计与开发
java·开发语言
黎雁·泠崖1 小时前
Java核心基础API学习总结:从Object到包装类的核心知识体系
java·开发语言·学习
Yvonne爱编码1 小时前
JAVA数据结构 DAY1-集合和时空复杂度
java·数据结构·python