面试题:使用 new String(“yupi”) 语句在 Java 中会创建多少个对象?

在 Java 中,使用 new String("yupi") 创建字符串时,最多会创建 1 个或 2 个对象,具体取决于字符串常量池中是否已经存在 "yupi" 这个字符串。


✅ 详细分析:

🔹 语句:new String("yupi")

这个语句分为两个部分:

  1. 字符串字面量 "yupi"
    • 这个部分会在 编译期 被放入 字符串常量池(String Pool)
    • 如果常量池中已有 "yupi",则不会新建对象。
    • 如果常量池中没有 "yupi",则会创建一个 String 对象放入常量池。
  2. new String(...)
    • 这部分会在 堆(heap) 中创建一个新的 String 对象,内容是常量池中字符串的拷贝。

🧠 所以总共创建的对象数:

情况创建对象数说明
"yupi" 已在常量池中1 个对象只在堆中创建一个新的 String 对象
"yupi" 不在常量池中2 个对象1 个在常量池中,1 个在堆中

✅ 示例说明:

String s1 = new String("yupi");
  1. 编译时,"yupi" 会被放入字符串常量池。
  2. 运行时,new String(...) 会在堆中创建一个新的 String 对象。

🔍 补充说明:

  • new String("yupi") 的构造函数内部调用了 new String("yupi".value),即使用常量池中的字符数组构造一个新的字符串对象。
  • Java 7 及以后版本中,字符串常量池已经从 永久代(PermGen) 移到了 堆内存(Heap),但对象创建逻辑不变。
  • 如果你使用的是 Java 8 及以后版本,字符串常量池仍在堆中,只是有专门的优化机制。

✅ 面试建议回答:

使用 new String("yupi") 创建字符串时,最多会创建两个对象

  • 一个是字符串常量池中的 "yupi"(如果之前没有的话);
  • 另一个是堆中通过 new 创建的新的 String 实例。

如果常量池中已经存在 "yupi",则只会创建 1 个对象(堆中的新对象)。


💡 扩展知识(常见误区):

很多人误以为 new String("xxx") 一定会创建两个对象,但实际上这取决于字符串是否已经存在于常量池中,因此 “最多两个” 是更准确的说法。


🧠 小技巧记忆:

new String("xxx") = 1(堆) + 有条件(常量池)


如果你在面试中能解释清楚常量池、堆、对象创建逻辑以及版本差异,会给面试官留下非常好的印象。

THE END
喜欢就支持一下吧
点赞6 分享