所以我正在从Kathy Sierra的书中学习SCJP。 在字符串一章中,这是一个问题:
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat( "fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1+" "+s2);
---------------------------
What's the output, and how many string objects and ref variables are created?
输出是春冬春夏,有两个参考变量,没关系。
然后它说有八个字符串对象被创建(春天,夏天,春天......等)包括由于没有引用它们而丢失的那些。
但是,它不包括最后一个sysout中的任何内容。
我的问题是,在最后一行代码中,由于s1和s2正在与空格连接,这是否也会创建新对象?或者它只是传递给字符串缓冲区进行显示,而不是创建新对象?
这显然是非常基本的,我看了别处,但没有直接回答这个问题。根据我的理解,它也应该在那里创建新的对象,但我需要确保参加考试!想法?
先谢谢!
答案 0 :(得分:5)
我的问题是,在最后一行代码中,由于s1和s2正在与空格连接,这是否也会创建新对象?
是的,它会创建第10个字符串。
请注意,这段代码本身只需创建 5个字符串 - 如果您在同一个JVM中多次运行它,每次调用它时都会创建5个新字符串。每次代码运行时,字符串文字都不会创建新字符串。 (例如,每次都为"spring "
重复使用相同的字符串对象。)
您提供的代码中有10个字符串:
s1 + "summer"
,s1.concat("fall ")
,s1 + winter
(带复合赋值)和s1 + " " + s2
。正如我刚刚评论的那样,代码中出现的字符串文字不会始终涉及单独的字符串。例如,考虑:
String x = "Foo" + "Bar";
您可能希望涉及三个字符串对象 - 一个用于每个文字,一个用于连接。实际上,它只涉及一个,因为编译器在编译时执行连接,所以代码是有效的:
String x = "FooBar";
答案 1 :(得分:2)
我会回答另一个更清楚的问题:以下代码片段中涉及多少个String实例:
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat( "fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1+" "+s2);
总共10个。