字符串池中将创建多少个对象?

How many objects will be created in string pool?

在以下Java代码中将创建多少个对象:

String s = "abc";
s = "";
String s2 = new String("mno");
s2 = "pqr";
  1. String s = "abc"; → 一个对象,进入字符串池,因为使用了文字“abc”;
  2. s = ""; → 一个空字符串 ("") 对象,并且再次 - 在字符串池中分配;
  3. String s2 = new String("mno"); → 另一个使用显式 new 关键字创建的对象,请注意,它实际上涉及 另一个 文字对象(同样 - 创建于字符串池) - "mno";总的来说,这里有两个对象;
  4. s2 = "pqr"; → 另一个对象,正在存储到字符串池中。

所以,总共有5个对象; 4 个在字符串池中(a.k.a."intern pool"),一个在普通堆中。

请记住,无论何时您使用 "string literal",JVM 都会首先检查字符串池中是否存在相同的字符串对象(根据 String::equals..()),然后执行以下操作之一:

  1. 如果对应的字符串不存在,JVM创建一个字符串对象放入字符串池中。该字符串对象是 JVM 可以重用的候选者,只要等于它(同样,根据 String::equals(..))引用字符串文字(没有显式 new);
  2. 如果相应的字符串存在,则只返回其引用,而不创建任何新内容。