15. String s = new String(“xyz”);创建了几个字符串对象
大约 2 分钟
在Java中,当执行String s = new String("xyz");
时,会创建两个字符串对象:
- 字符串常量池中的对象
"xyz"
是一个字符串字面量,它会首先被放入字符串常量池中。如果常量池中已经存在相同内容的字符串,那么不会创建新的对象,而是直接使用池中的对象。
new String("xyz")
创建的对象new String("xyz")
会在堆内存中创建一个新的String
对象,并且这个对象是对常量池中"xyz"
字符串的一个副本。- 这个新创建的
String
对象与常量池中的字符串对象内容相同,但它是一个独立的对象。
详细解释
- 在执行
String s = new String("xyz");
时,首先Java会查找字符串常量池中是否已经存在"xyz"
。如果不存在,Java会在常量池中创建一个"xyz"
字符串对象。 - 接着,
new String("xyz")
在堆内存中创建一个新的String
对象,它包含与常量池中的"xyz"
相同的字符序列,但它们是两个不同的对象。
示例验证
你可以通过==
运算符来验证这两个字符串对象是否是同一个对象。
public class StringCreationExample {
public static void main(String[] args) {
String s1 = "xyz"; // 常量池中的对象
String s2 = new String("xyz"); // 堆内存中的新对象
System.out.println(s1 == s2); // 输出 false,表示s1和s2引用不同的对象
}
}
在这个示例中,s1
引用的是字符串常量池中的对象,而s2
引用的是通过new
创建的堆内存中的对象,因此==
比较会返回false
。
总结
- 这段代码会创建两个字符串对象:一个在字符串常量池中,一个在堆内存中。