JVM之String创建、拼接

一、字符串创建的两种方式

1. 字面量直接赋值

java 复制代码
String s1 = "a";  
  • 过程
    1. JVM 检查字符串常量池中是否存在 "a"
    2. 若存在,直接返回常量池中的引用。
    3. 若不存在,在常量池中创建 "a",返回其引用。
  • 特点
    • 所有相同字面量的变量共享同一份常量池对象

2. 显式调用 new String()

java 复制代码
String s2 = new String("a");  
  • 过程
    1. 检查字符串常量池:
      • 若池中无 "a"先在池中创建 "a"
      • 若已有,直接使用池中的 "a"
    2. 在堆内存中新建一个独立对象 ,内容与常量池中的 "a" 相同。
    3. 栈中的引用 s2 指向堆中的新对象。
  • 特点
    • 每次 new 都会在堆中生成新对象,与常量池无关。

2. 内存示意图

复制代码
栈内存           堆内存               字符串常量池  
+------+         +----------------+    +-----+  
|  s1  | ------> |                |    | "a" |  
+------+         +----------------+    +-----+  
|  s2  | ------> | String对象"a"  |  
+------+         +----------------+  
  • s1 直接指向常量池中的 "a"
  • s2 指向堆中的独立对象,堆对象与常量池中的 "a" 无直接关联。

四、字符串拼接的内存行为

1. 编译期优化(纯字面量拼接)

java 复制代码
String s3 = "a" + "b";  // 编译后等价于 String s3 = "ab";  
  • 过程
    • 编译器直接合并为 "ab",存入字符串常量池。

2. 运行时拼接(含变量)

java 复制代码
String s1 = "a";  
String s2 = s1 + "b";  
  • 过程
    1. 运行时通过 StringBuilder 拼接,生成新字符串 "ab"
    2. 结果存放在堆内存中(非常量池)。

intern()

1. 作用

  • 将堆中的字符串对象尝试放入常量池
    • 若常量池中已有相同内容,返回池中对象的引用。
    • 若池中无此内容,将堆中对象的引用存入池中(JDK 7+),后续复用。

2. 示例

java 复制代码
String s4 = new String("a").intern();  
String s5 = "a";  
System.out.println(s4 == s5); // true(均指向常量池)  

相关推荐
m0_715575348 分钟前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
Word码1 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
符哥20087 小时前
C++ 进阶知识点整理
java·开发语言·jvm
夕除8 小时前
js--15
java·jvm·spring
4311媒体网10 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
猫头虎20 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
wgslucky20 小时前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
痴儿哈哈1 天前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
野犬寒鸦1 天前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习