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 都指向字符串常量池中的对象。

总结:

相关推荐
通信小呆呆12 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick12 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee12 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
源分享12 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Alsn8612 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e12 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨12 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
JAVA96512 天前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的
java·jvm·面试
cqbzcsq12 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan12 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析