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内存问题时,记得先检查是否合理利用了字符串常量池的特性!

相关推荐
w_zero_one2 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan2 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David2 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源3 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David3 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122663 小时前
网络编程^
java
Thinker QAQ4 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
齐 飞4 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色4 小时前
多AS互联BGP4综合实验设计
java
某不知名網友5 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft