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

Nil*_*hal 5 java string scjp immutability 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?
Run Code Online (Sandbox Code Playgroud)

输出是春冬春夏,有两个参考变量,没关系.

然后它说创建了八个字符串对象(春天,夏天,春天......等)包括由于没有引用它们而丢失的那些.

但是,它不包括最后一个sysout中的任何内容.

我的问题是,在最后一行代码中,由于s1和s2正在与空格连接,这是否也会创建新对象?或者它只是传递给字符串缓冲区进行显示,而不是创建新对象?

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

提前致谢!

Jon*_*eet 5

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

是的,它创建了第10个字符串.

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

您给出的代码中有10个字符串:

  • 5个文字:"春天","夏天","秋天","冬天"和""
  • 5分级联的结果:s1 + "summer",s1.concat("fall "),s1 + winter(与化合物赋值)和s1 + " " + s2.

正如我刚才所评论的那样,代码中出现的字符串文字并不总是涉及单独的字符串.例如,考虑:

String x = "Foo" + "Bar";
Run Code Online (Sandbox Code Playgroud)

您可能希望涉及三个字符串对象 - 一个用于每个文字,一个用于连接.实际上,它只涉及一个,因为编译器在编译时执行连接,所以代码是有效的:

String x = "FooBar";
Run Code Online (Sandbox Code Playgroud)