在 Java 中,使用 new String("yupi") 创建字符串时,最多会创建 1 个或 2 个对象,具体取决于字符串常量池中是否已经存在 "yupi" 这个字符串。
✅ 详细分析:
🔹 语句:new String("yupi")
这个语句分为两个部分:
- 字符串字面量
"yupi"- 这个部分会在 编译期 被放入 字符串常量池(String Pool)。
- 如果常量池中已有
"yupi",则不会新建对象。 - 如果常量池中没有
"yupi",则会创建一个String对象放入常量池。
new String(...)- 这部分会在 堆(heap) 中创建一个新的
String对象,内容是常量池中字符串的拷贝。
- 这部分会在 堆(heap) 中创建一个新的
🧠 所以总共创建的对象数:
| 情况 | 创建对象数 | 说明 |
|---|---|---|
"yupi" 已在常量池中 | 1 个对象 | 只在堆中创建一个新的 String 对象 |
"yupi" 不在常量池中 | 2 个对象 | 1 个在常量池中,1 个在堆中 |
✅ 示例说明:
String s1 = new String("yupi");
- 编译时,
"yupi"会被放入字符串常量池。 - 运行时,
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


