System.out.println中使用的字符串是否也会创建新的不可变对象?

时间:2013-05-22 11:02:15

标签: java string immutability scjp system.out

所以我正在从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正在与空格连接,这是否也会创建新对象?或者它只是传递给字符串缓冲区进行显示,而不是创建新对象?

这显然是非常基本的,我看了别处,但没有直接回答这个问题。根据我的理解,它也应该在那里创建新的对象,但我需要确保参加考试!想法?

先谢谢!

2 个答案:

答案 0 :(得分:5)

  

我的问题是,在最后一行代码中,由于s1和s2正在与空格连接,这是否也会创建新对象?

是的,它会创建第10个字符串。

请注意,这段代码本身只需创建 5个字符串 - 如果您在同一个JVM中多次运行它,每次调用它时都会创建5个新字符串。每次代码运行时,字符串文字都不会创建新字符串。 (例如,每次都为"spring "重复使用相同的字符串对象。)

您提供的代码中有10个字符串:

  • 5个文字:“春天”,“夏天”,“秋天”,“冬天”和“”
  • 5个连接结果: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);
  1. 字符串文字“spring”
  2. String literal“summer”
  3. 串联s1和“夏天”
  4. String literal“fall”
  5. 连接s1和“fall”
  6. s2和s1的连接
  7. String literal“winter”
  8. 串联s1和“冬天”
  9. String literal“”
  10. sysout
  11. 中s1和s2的连接

    总共10个。