字符串文字池

String Literal Pool

嗯,我有这样的代码

String s = "hello";
String s2 = s + "world";

我知道变量 s 存储在字符串文字池的 Java 堆中。我还知道变量 s2 存储在 Java 堆中(因为本例中的“+”创建了一个新对象)。但我的问题是:将 "world" 放入 Pool 中,否则什么也不会发生?

是的,会的。无论何时/无论何时,你都声明了一个 String 文字,它显然会进入池,无论它的用法如何。

由于池中不存在String "world",一个新的String对象实例化,然后将其放入池中。

当我们使用双引号创建一个String时,它首先在String池中寻找具有相同值的String,如果找到它只是returns引用否则它会在池中创建一个新的 String 然后 returns 引用。

基本上,'s'和's2'只是引用,而真实对象是"Hello"和"world"。这遵循指定字符串是不可变的而字符串引用不是的概念。所以,是的,因为 "world" 是 String 对象,除了是 String 字面量之外,它会像 hello 一样存储在堆中。还要记住 's' 和 's2' 都不会作为可变字符串引用进入堆。