Java 字符串文字池

Java String Literal Pool

假设我们有以下代码

String x = new String("xyz");
String y = "abc";
x = x + y;

朋友说一共创建了4个对象,我说只创建了3个。有人可以解释一下后台发生了什么吗?我读过有关字符串文字池的内容,但我可以找到答案。

我对3个对象的创建解释如下:一个在编译时在String Literal Pool中("abc"),两个在运行时在堆上("abc"和x + y)

实际上.. 当两个字符串具有相同的值时,字符串池会起作用。

例如,如果我们有字符串 s1="abc" 和 s2="abc",那么 s1 和 s2 将指向相同的内存引用(或对象)。

在上面的例子中,将创建 3 个对象

  1. 堆上的 x 变量

  2. 对于堆栈上的 y 变量

  3. for x+y expression on heap

将创建 4 个对象。

字符串是 unmodifiable 所以每次连接它们时都会创建一个新对象

new String("xyz"); 中的 "xyz" 的情况下,您首先创建 "xyz" 对象然后将其传递给新对象 (String) 因此,这里有两个对象

new String("xyz") <--there are two objects 
"abc"   <-- kinda obvious
x + y  <-- String are unmodifiable thus this is a new object

创建了 4 个对象如下

// 1. "xyz" in the literal pool
// 2. a new String object which is a different object than "xyz" in the pool
String x = new String("xyz");

// 3. "abc" in the literal pool
String y = "abc";

// 4. new String object
x = x + y;

是的,代码将创建 4 个对象

String x = new String("xyz"); // object#1 : xyz and Object #2: new String
String y = "abc";             // Object#3 : abc
x = x + y;                    // object#4 : xyzabc