【面试题】Java中,String str=new String(“abc“);创建了几个对象?
2026/4/1 3:41:37 网站建设 项目流程

本文博主介绍一道经典的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个对象(堆中的新对象)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询