news 2026/9/6 15:58:00

【面试题】Java中,String str=new String(“abc“);创建了几个对象?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【面试题】Java中,String str=new String(“abc“);创建了几个对象?

本文博主介绍一道经典的Java面试题,需要分两种情况讨论,关键点在于字符串常量池运行时堆的区别。

Java中,String str=new String("abc");创建了几个对象?

情况一:当常量池中不存在"abc"字符串对象时

会创建 2 个对象

  1. 第一个对象(在字符串常量池中)
    类加载时,"abc"这个字面量会被放入方法区的字符串常量池(JDK 7+ 后,常量池移到了堆中)。
  2. 第二个对象(在堆内存中)
    new String("abc")会在堆内存中创建一个新的String对象,它的内容指向常量池中的"abc"

所以,总共创建了:1个常量池对象 + 1个堆对象 = 2个对象


情况二:当常量池中已经存在"abc"字符串对象时

会创建 1 个对象

  1. 第0个对象(已在常量池中)
    之前已经通过其他方式(例如之前的代码执行过"abc"字面量或intern()方法)将"abc"放入了常量池,所以此时不会再创建常量池对象。
  2. 第一个对象(在堆内存中)
    new String("abc")仍然会在堆中创建一个新的String对象。

所以,总共创建了:0个常量池对象 + 1个堆对象 = 1个对象


代码示例说明

// 假设程序刚开始运行,常量池是空的Strings1="abc";// 第一次出现"abc",常量池创建1个对象,堆中不创建Strings2=newString("abc");// 常量池已存在"abc",不再创建;堆中创建1个新对象
  • 第一行:创建1个对象(常量池)。
  • 第二行:创建1个对象(堆)。
  • 两行总共创建2个对象(1个常量池 + 1个堆)。

核心总结

  • String str = new String("abc");中的"abc"字面量本身会触发常量池对象的创建(如果尚未存在)。
  • new关键字总是会在堆中创建一个新的String对象。
  • 所以,可能的创建对象数是1个或2个,取决于常量池的初始状态。
  • 这也是为什么推荐使用String s = "abc";而不是new String("abc"),避免不必要的堆对象创建。

最终答案(面试标准回答):

如果字符串常量池中之前没有"abc",则会创建2个对象(1个在常量池,1个在堆)。
如果常量池中已有"abc",则只会创建1个对象(堆中的新对象)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 1:00:37

如何处理Redis集群数据倾斜?

在正常情况下,各数据分片节点的Key数量是均匀分布的,同时内存使用率、CPU使用率等性能指标也是相近的。一般是在使用Redis的过程中,设计考虑不周、不规范的数据写入及突发的访问量,造成redis个别的节点数据量倾斜或数据访问倾斜&a…

作者头像 李华
网站建设 2026/8/23 3:47:29

人形机器人新产品导入(NPI)工程师的角色与技能解析

芯联集成电路制造股份有限公司 人形机器人NPI (J10588)职位信息 工作职责: 1. 主导机器人新产品装配工艺设计与样品试做,梳理并解决试做问题(如关节精度、传感器集成等),推动问题闭环,支撑批量生产。 2. 开展机器人新产品工艺评审与可制造性评估,识别潜在风险点并优化结构…

作者头像 李华
网站建设 2026/8/30 5:37:17

jsp旅行体验交流平台u25tv--程序+源码+数据库+调试部署+开发环境

本系统(程序源码数据库调试部署开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,景点分类,美食分类,旅游景点,特色美食,旅游攻略开题报告内容一、研究背景随着旅游业的蓬勃发展,人们…

作者头像 李华
网站建设 2026/8/21 13:12:48

单相桥式半波可控整流:从电阻到电感负载的奇妙旅程

单相桥式半波可控整流电路,在带纯电阻负载和阻感负载下的仿真,可以提供报告,报告为本人纯手写 仿真加报告 最近在实验室折腾可控整流电路,发现不同负载类型对输出波形的影响比想象中有趣。特别是当负载从纯电阻变成阻感负载时&am…

作者头像 李华