创建了多少个 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 引用引用的对象不同。
Thanks
Edit
另外,请注意,我有兴趣了解创建的对象总数,包括那些被丢弃的对象,而不仅仅是最终进入常量池的对象。
Edit
看看乔恩的回答,我可能完全误解了对象的创建方式。我知道字符串在常量池中仅创建一次,并且会被重用,但我不确定构造“最终”字符串时所经历的过程。这是我正在阅读的书中的部分,它似乎表明创建临时对象,这与此处的答案完全相反。 (也许这本书是错的,或者我误解了这本书)
代码示例是
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1 + " " + s2);
问题是
输出是什么?对于额外的学分,有多少个 String 对象以及如何
创建了许多参考变量在 println 语句之前.
以及答案
该代码片段的结果是spring water spring summer
。那里
是两个参考变量,s1 和 s2。总共有八个
创建的字符串对象如下“spring”、“summer”(丢失)、“spring”
夏天”、“秋天”(丢失)、“春天秋天”(丢失)、“春夏春天”
(丢失)、“冬天”(丢失)、“春冬”(此时“春”是
丢失的)。八个 String 对象中只有两个没有丢失
过程
Thanks