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