在 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