前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >new String之后会创建几个对象

new String之后会创建几个对象

原创
作者头像
麦辣鸡腿堡
发布2025-03-18 11:22:37
发布2025-03-18 11:22:37
4900
代码可运行
举报
文章被收录于专栏:面试面试
运行总次数:0
代码可运行

在 Java 中,使用 new String("abc") 创建字符串对象时,是否创建两个对象取决于字符串常量池中是否已存在 "abc"。以下是具体分析:

  1. 创建两个对象的情况

当字符串常量池中不存在 "abc" 时,执行 new String("abc") 会创建两个对象:

  • 对象1(字符串常量池):字面量 "abc" 会被存入字符串常量池(JDK 1.7+ 后常量池位于堆中)。
  • 对象2(堆内存)new 关键字会在堆中创建一个新的 String 对象,内容复制自常量池中的 "abc"。

示例

代码语言:javascript
代码运行次数:0
运行
复制
String s = new String("abc");

此时内存中生成两个对象:

  1. 字符串常量池中的 "abc"。
  2. 堆内存中由 new 生成的新 String 对象
  3. 仅创建一个对象的情况

当字符串常量池中已存在 "abc" 时,执行 new String("abc") 仅创建一个对象:

  • 对象(堆内存)new 在堆中创建新的 String 对象,但不会重复生成常量池中的 "abc"

示例

代码语言:javascript
代码运行次数:0
运行
复制
String s1 = "abc";           // 常量池生成 "abc"
String s2 = new String("abc"); // 仅堆中生成新对象

此时 s2 指向堆中的新对象,而常量池中的 "abc" 已存在

关键机制

  • 字符串常量池的作用:避免重复创建相同内容的字符串,节省内存。
  • new 的行为:强制在堆中生成新对象,与常量池无关。即使内容相同,new 的对象地址也不同(== 比较为 false

内存模型验证

通过以下代码可验证两种场景:

代码语言:javascript
代码运行次数:0
运行
复制
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
  • s1 直接指向常量池中的 "abc"。
  • s2 指向堆中的新对象,但内容与常量池一致

总结

  • 默认行为new String("abc") 最多可能创建两个对象,具体取决于常量池状态。
  • 优化建议:优先使用字面量赋值(String s = "abc"),避免不必要的堆对象开销

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键机制
  • 内存模型验证
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档