JVM学习-基础篇-字符串常量池

字符串常量池

字符串常量池存储在代码中定义的常量字符串内容。比如 "123" 这个123 就会被放入字符串常量池。

如下代码执行时,代码中包含 abc 字符串,就会被直接放入字符串常量池。在堆上创建 String 对象,并通过局部变量 s1 引用堆上的对象。

接下来通过 s2 局部变量引用字符串常量池的 abc。

所以 s1 和 s2 指向的不是同一个对象,打印出 false。

字符串常量池和运行时常量池有什么关系?

早期设计时,字符串常量池是属于运行时常量池的一部分,他们存储的位置也是一致的。后续做出了调整,将字符串常量池和运行时常量池做了拆分。

练习题1
java 复制代码
 /**
  * 字符串常量池案例
  */
 public class Demo2 {
     public static void main(String[] args) {
         String a = "1";
         String b = "2";
         String c = "12";
         String d = a + b;
         System.out.println(c == d);
     }
 }

1、首先将 "1" 放入字符串常量池,通过局部变量 a 引用字符串常量池中的 "1" 字符串。

2、同理处理 b 和 c:

3、将 a 和 b 指向的字符串进行连接,本质上就是使用 StringBuilder 进行连接,最后创建了一个新的字符串放入堆中。然后将局部变量 d 指向堆上的对象。

4、所以c和d指向的不是同一个对象,打印出的结果就是false。

练习题2
java 复制代码
/**
  * 字符串常量池案例
  */
 public class Demo3 {
     public static void main(String[] args) {
         String a = "1";
         String b = "2";
         String c = "12";
         String d = "1" + "2";
         System.out.println(c == d);
     }
 }

编译之后的字节码指令如下:

说明在编译阶段,已经将 1 和 2 进行连接,最终生成 12 的字符串常量池中的结果。所以返回结果就是 true,c 和 d 都指向字符串常量池中的对象。

总结:

相关推荐
世人万千丶9 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
遇乐的果园12 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
白露与泡影13 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
遇乐的果园14 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_14 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
可乐奶茶sky14 小时前
AI Agent 学习
人工智能·学习
茯苓gao15 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
Ai_easygo15 小时前
MCP 协议实战:用 Claude Desktop 连本地 SQLite,5 分钟搭一个能查数据的 AI 助手
jvm·人工智能·sqlite
RD_daoyi17 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
chase。17 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人