字符串池中将创建多少个对象?
How many objects will be created in string pool?
在以下Java代码中将创建多少个对象:
String s = "abc";
s = "";
String s2 = new String("mno");
s2 = "pqr";
String s = "abc";
→ 一个对象,进入字符串池,因为使用了文字“abc”;
s = "";
→ 一个空字符串 (""
) 对象,并且再次 - 在字符串池中分配;
String s2 = new String("mno");
→ 另一个使用显式 new
关键字创建的对象,请注意,它实际上涉及 另一个 文字对象(同样 - 创建于字符串池) - "mno"
;总的来说,这里有两个对象;
s2 = "pqr";
→ 另一个对象,正在存储到字符串池中。
所以,总共有5个对象; 4 个在字符串池中(a.k.a."intern pool"),一个在普通堆中。
请记住,无论何时您使用 "string literal"
,JVM 都会首先检查字符串池中是否存在相同的字符串对象(根据 String::equals..()
),然后执行以下操作之一:
- 如果对应的字符串不存在,JVM创建一个字符串对象放入字符串池中。该字符串对象是 JVM 可以重用的候选者,只要等于它(同样,根据
String::equals(..)
)引用字符串文字(没有显式 new
);
- 如果相应的字符串存在,则只返回其引用,而不创建任何新内容。
在以下Java代码中将创建多少个对象:
String s = "abc";
s = "";
String s2 = new String("mno");
s2 = "pqr";
String s = "abc";
→ 一个对象,进入字符串池,因为使用了文字“abc”;s = "";
→ 一个空字符串 (""
) 对象,并且再次 - 在字符串池中分配;String s2 = new String("mno");
→ 另一个使用显式new
关键字创建的对象,请注意,它实际上涉及 另一个 文字对象(同样 - 创建于字符串池) -"mno"
;总的来说,这里有两个对象;s2 = "pqr";
→ 另一个对象,正在存储到字符串池中。
所以,总共有5个对象; 4 个在字符串池中(a.k.a."intern pool"),一个在普通堆中。
请记住,无论何时您使用 "string literal"
,JVM 都会首先检查字符串池中是否存在相同的字符串对象(根据 String::equals..()
),然后执行以下操作之一:
- 如果对应的字符串不存在,JVM创建一个字符串对象放入字符串池中。该字符串对象是 JVM 可以重用的候选者,只要等于它(同样,根据
String::equals(..)
)引用字符串文字(没有显式new
); - 如果相应的字符串存在,则只返回其引用,而不创建任何新内容。