String s = new String(“abc”)创建了几个对象?

String s = new String("abc"),创建了1个、或者2个 String 对象。

为什么说是1个、或者是2个呢?这里的关键点是:常量池是否已经创建过对象。

当 Java 遇到字面量字符串 "abc" 时,它会检查字符串常量池中是否已经存在这个字符串。

如果不存在,它会创建一个新的 String 对象,并将其放入字符串常量池中。

调用 new String("abc") 会显式地创建一个新的 String 对象,这个新对象在堆上,即使字符串常量池中已经有了 "abc"

总的来说,这个语句在以下两种情况下会创建不同数量的对象:

1.如果常量池中没有 "abc"

  • 一个在字符串常量池中的 String 对象。
  • 一个在堆上的 String 对象。
  • 总共两个 String 对象。

2.如果常量池中已经有 "abc"

一个在堆上的 String 对象,总共一个 String 对象。

看一个例子:

public class StringCreationExample {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");

        System.out.println(s1 == s2); // 输出 false,因为 s2 是 new 出来的新对象
        System.out.println(s1.equals(s2)); // 输出 true,因为它们的值相同
    }
}

输出结果为:

false
true

在上述代码中:

  • s1 引用的是字符串常量池中的 "abc" 对象。
  • s2 引用的是 new String("abc") 创建的堆中的新对象。

因此,s1 == s2 会返回 false,因为它们是两个不同的对象。

所以,如果常量池中还没有 "abc",会创建2个对象:

  • 一个在字符串常量池中的 String 对象(如果常量池中还没有 "abc")。
  • 一个在堆上的 String 对象,由 new String("abc") 创建。

如果在字符串常量池中存在其代表的对象,就创建1个。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法