news 2026/9/2 22:38:49

【面试题】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/2 23:31:21

代码重构指南:优化建议系统

代码重构指南:优化建议系统关键词:代码重构、优化建议系统、代码质量、软件开发、算法原理、实战案例摘要:本文围绕代码重构的优化建议系统展开,旨在为开发者提供全面的技术指导。首先介绍了代码重构及优化建议系统的背景&#xf…

作者头像 李华
网站建设 2026/9/3 0:24:35

从 TCP 到 HTTP 再到 RPC:网络协议的三次抽象革命

从 TCP 到 HTTP 再到 RPC:网络协议的三次抽象革命 这是一个非常经典、也极其容易被误解的问题。 很多讨论都会演变成: HTTP 和 RPC 谁更先进? gRPC 是不是要取代 REST? TCP 既然这么强,为什么还要搞这么多协议? 真正的答案只有一句话: 它们不是替代关系,而是一次又一…

作者头像 李华
网站建设 2026/9/3 1:31:15

基于深度学习YOLOv11的汽车损坏识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本项目基于前沿的YOLOv11目标检测架构,研发了一套高性能的汽车损坏智能识别与检测系统。该系统以精准识别和定位图像或视频中的车辆损伤区域为核心目标,专注于“Car-Damage”这一单一类别进行深度优化,能够有效应对各种复杂环境…

作者头像 李华
网站建设 2026/9/3 4:07:53

基于SpringBoot的合同信息管理系统设计实现

背景分析 传统合同管理多依赖纸质文档或本地电子表格,存在效率低、易丢失、检索困难等问题。随着企业数字化转型加速,对合同全生命周期(起草、审批、签署、归档、统计)的智能化管理需求显著增长。SpringBoot作为轻量级Java框架&a…

作者头像 李华
网站建设 2026/9/2 20:21:25

springboot基于JavaWeb的点餐系统

技术背景Spring Boot作为Java生态中流行的微服务框架,简化了传统JavaEE(如SSM)的开发流程,通过自动配置、内嵌服务器等特性,显著提升了开发效率。JavaWeb技术栈(Servlet/JSP)在餐饮管理系统开发…

作者头像 李华