创建了多少个 String 对象
我正在为 SCJP 学习,我似乎无法解决这个字符串问题。根据我看待问题的方式,我似乎看到了几个可能的答案。
在下面的初始化中,创建了多少个字符串对象?
String s1 = "A" + "B" + "C" + "D";
System.out.println(s1)
最初我认为 5 个对象,即
"A"
"B"
"C"
"D"
"ABCD"
但是再想一想我不太确定,因为例如编译器会连接"A" + "B"
为一个对象吗?即创建 7 个对象?
"A"
"B"
"C"
"D"
"AB"
"ABC"
"ABCD"
此外,如果将代码更改为
String s1 = new String("A" + "B" + "C" + "D");
System.out.println(s1);
最后怎么样:
String s1 = "A";
String s2 = new String("A");
在上面的例子中,我认为只会创建 2 个对象
object 1 - "A"
object 2 - a String object that refers to the "A" object above.
这是正确的还是它们不相关?即,从常量池引用的对象将不同于 s2 引用所引用的对象。
谢谢
编辑
另外,请注意我有兴趣知道创建的对象总数,包括那些被丢弃的对象,而不仅仅是那些最终进入常量池的对象。
编辑
看着乔恩的回答,我可能完全误解了对象的创建方式。我知道一个字符串在常量池中只创建一次并且它被重用但我不确定构造“最终”字符串时所经历的过程。这是我正在阅读的书中的部分,这似乎表明创建了临时对象,这与这里的答案完全相反。(或者这本书是错的,或者我误解了这本书)
代码示例是
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1 + " " + s2);
问题是
输出是什么?对于额外的功劳,在 println 语句之前创建了多少个 String 对象和多少个引用变量。
而答案
此代码片段的结果是
spring water spring summer
. 有两个参考变量,s1 和 s2。一共创建了八个String对象,分别为“spring”、“summer”(丢失)、“spring summer”、“falls”(丢失)、“spring fall”(丢失)、“spring summer spring”(丢失) ,“冬天”(丢失),“春天冬天”(此时“春天”丢失)。八个String对象中只有两个在这个过程中没有丢失
谢谢