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

总结:

相关推荐
Miki Makimura2 小时前
SQL 核心对象学习
数据库·sql·学习
炽烈小老头2 小时前
【每天学习一点算法 2026/04/02】最长递增子序列
学习·算法
linwq82 小时前
SIP协议、linphone学习(二)
学习
庞轩px2 小时前
后端开发面试题总结
java·jvm·面试·并发编程·mysql与redis·spring与消息队列·网络协议与设计模式
鱼鳞_3 小时前
Java学习笔记_Day21
java·笔记·学习
EnglishJun3 小时前
ARM嵌入式学习(十五)--- IMX6ULL的ADC接口使用
arm开发·学习
禹中一只鱼3 小时前
【力扣热题100学习笔记】 - 双指针
java·笔记·学习·leetcode·贪心算法
haiyangyiba4 小时前
学习Spring Ai的摸索实践
学习·spring ai
chase。4 小时前
【学习笔记】cuRoboV2——为高自由度机器人打造的动力学感知运动生成框架
笔记·学习·机器人