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 个对象
堆上的 x 变量
对于堆栈上的 y 变量
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
假设我们有以下代码
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 个对象
堆上的 x 变量
对于堆栈上的 y 变量
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