当前位置: 首页 > news >正文

【面试题】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个对象(堆中的新对象)。

http://www.jsqmd.com/news/330632/

相关文章:

  • 设计竞品分析简易工具,录入竞品信息,对比价格优势,用户评价,找出差异化卖点,生成分析报告,帮创业者打造核心竞争力。
  • Python数据科学:利用Pandas与NumPy进行高效数据清洗
  • 【电路笔记】-非稳态多谐振荡器
  • 代码重构指南:优化建议系统
  • 动态加载字节码
  • 6款AI论文神器实测:文献综述一键生成,真实文献交叉引用,效率飙升!
  • 从 0 到 1:基于 Spring Boot 3 + LangChain4j 构建企业级 AI 应用实战
  • 如何处理Redis集群数据倾斜?
  • 全球股市估值与基因治疗技术的关系
  • 基于 Netty 的 TCP Socket 服务端完整实现(生产级增强版)
  • Python异步编程实战:用asyncio构建高性能网络服务
  • 微服务架构下Spring Cloud服务发现与配置管理详解
  • 人形机器人新产品导入(NPI)工程师的角色与技能解析
  • 从 TCP 到 HTTP 再到 RPC:网络协议的三次抽象革命
  • 深度解析:人形与轮臂机器人领域顶尖专家——技术引领、创新落地与团队领导的核心能力
  • 使用React Hooks优化大型应用状态管理,提升开发效率
  • Abaqus中接触分析(隐式求解 Standard)
  • UE5 多线程(2-2):
  • 2026涡轮蜗杆减速机领域:靠谱厂家排行与解析,提升机减速机/摆线尺寸齿轮减速机,涡轮蜗杆减速机制造商排行榜
  • Python异步编程实战:利用asyncio处理高并发IO任务
  • 基于SpringBoot的多功能音乐播放管理系统设计实现
  • AI应用架构师必读:数字资产管理平台的SRE实践
  • 深入解析Kubernetes服务网格,实现微服务高效通信
  • SAP公有云支持多工厂多仓管理吗?集团化管控解决方案实现指南
  • 基于SpringBoot的户外救援管理系统设计实现
  • 提示工程架构师能力评估标准全梳理
  • 万象生鲜配送系统订单全链路处理详解
  • Go语言并发编程:Goroutine与Channel的高效使用模式
  • springboot基于JavaWeb的点餐系统的设计与实现
  • 完整教程:物联网系统数字孪生驱动的预测性维护技术解析