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

总结:

相关推荐
估值探索者10 小时前
【Python量化系统工程实战 #08】从脚本到生产:量化系统上线 checklist 的最小闭环
java·开发语言·jvm·python·数据挖掘·数据·股票数据api接口
一隅论数智10 小时前
OWL(Web Ontology Language)介绍与使用举例(二)
大数据·经验分享·笔记·学习·自然语言处理·学习方法·政务
我命由我1234510 小时前
Photoshop - Photoshop 使用内容识别填充移除对象
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·photoshop
梓雨枔11 小时前
JavaScript+快速学习,简单好用~
javascript·学习
Chase_______11 小时前
【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
java·开发语言·jvm
老王爱玩车11 小时前
自定义类型:结构体
c语言·开发语言·学习
JWASX12 小时前
Java 转 go 学习 - GRPC(1)
学习·golang
用户0942485680313 小时前
第28章:JDK容器感知、cgroup与云原生JVM参数治理
java·jvm
鬼手点金13 小时前
opencode-全能开发者配置
java·linux·服务器·前端·javascript·学习·前向传播
代码山河13 小时前
Java学习路线图:2026年最新版,从入门到架构师
java·学习·架构·教程·面向对象·项目