250429-String的创建

new String()的底层原理

堆空间中 new 出来的 String 对象是如何“指向” "xyz" 的?
这是个很好的问题。
String s = new String("xyz");
这个语句的核心步骤如下:

  1. "xyz" 是一个字面量,在编译时就进入常量池
  2. "xyz" 会变成一个常量池中的 String 对象
  3. new String("xyz") 会在堆中创建一个新对象,调用构造方法:
    public String(String original) { this.value = original.value; }
    所以新对象会复制常量池中 "xyz" 对象的字符数组(char[]byte[],取决于版本)
    🔹 结论:
  • 堆中的 String 对象 并不直接指向常量池中的对象
  • 复制了常量池中对象的底层字符数组,作为自己的数据(在较新版本可能直接复用字符数组,视 JVM 实现)。

🧠 总结一句话:

new String("xyz") 创建的是一个新的 String 对象,它的内容来自于常量池中的 "xyz"复制字符数组,但它们是两个不同的对象,内容相同,引用不同。