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面试题总结》