2026-10-18 11:07:46
Java 字符串引用(String Interning)是指 JVM 通过维护一个字符串常量池(String Pool)来优化字符串内存分配的机制。
核心机制不可变性Java 的 String 类被设计为不可变(immutable),即一旦创建,其内容无法修改。这一特性使得字符串可以被安全地共享和复用。
字符串常量池JVM 在堆内存中维护一个特殊的存储区域——字符串常量池。当通过字面量(如 String s = "abc")创建字符串时:
JVM 首先检查池中是否存在相同内容的字符串。
若存在:直接返回池中已有对象的引用(避免重复创建)。
若不存在:在池中创建新字符串对象,并返回其引用。
new 关键字的区别通过 new String("abc") 显式创建的字符串不会自动加入常量池,即使池中已存在相同内容。此时会强制在堆中新建对象,导致引用不同。
可通过以下代码验证字符串引用是否相同:
@Testpublic void whenCreatingConstantStrings_thenTheirAddressesAreEqual() { String constantString1 = "HoneyMoose"; String constantString2 = "HoneyMoose"; assertThat(constantString1).isSameAs(constantString2); // 断言通过}字面量字符串自动加入常量池。
new String() 创建新对象,不共享引用。
intern() 可手动将字符串加入池中。
