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

总结:

相关推荐
dadaobusi2 小时前
学习:奈奎斯特
学习
11路没有终点4 小时前
Java 微服务性能调优:jstack/jmap/jstat 三剑客实战指南
jvm·性能测试
传奇开心果编程4 小时前
【Go入门练中学】第2课:条件与循环
后端·学习·golang
小小de风呀5 小时前
de风——【从零开始学C++】(二十)红黑树封装map和set
c++·学习
爱吃苹果的日记本5 小时前
数据结构第四课—线性表Linear List
数据结构·学习
昌原的儿子LEO5 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
Ray Wang5 小时前
Context上下文工程
python·学习·ai编程
百里香酚兰5 小时前
【Unity学习笔记】如何把粉色Prefab还原
笔记·学习·unity
索端阳5 小时前
ARM Day02 学习总结:ARM汇编基础核心知识点梳理
汇编·学习·arm
小叶肥辉6 小时前
LangChain链和LangGraph图的学习笔记【六】——提示语模板(3)——Few-Shot Prompting(少样本提示) 模板类
笔记·python·学习·langchain·prompt·aigc