系统中使用的java Do字符串。出来println是否也创建新的不可变对象?
所以我在为凯西·塞拉的书中的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?
输出是春天冬天春天夏天,有两个参考变量,这很好
然后它说创建了八个字符串对象(spring、summer、spring-summer…等等),包括那些由于没有引用而丢失的字符串对象
但是,它不包括上一个sysout中的任何内容
我的问题是,在最后一行代码中,由于s1和s2是用空格连接的,这不也会创建新对象吗?或者只是将其传递到字符串缓冲区进行显示,而不是创建新对象
这显然是非常基本的,我看了其他地方,但没有直接回答这个问题。根据我的理解,它也应该在那里创建新的对象,但我需要确保考试!想法
提前谢谢
# 1 楼答案
是的,它创建了第10个字符串
请注意,这段代码本身只需要创建5个字符串——如果您在同一个JVM中多次运行它,每次调用它时它都会创建5个新字符串。字符串文本不会在每次代码运行时创建新字符串。(例如,每次
"spring "
都会重复使用相同的字符串对象。)您给出的代码中有10个字符串:
s1 + "summer"
、s1.concat("fall ")
、s1 + winter
(带复合赋值)和s1 + " " + s2
李>正如我刚才所评论的,代码中出现的字符串文本并不总是包含一个单独的字符串。例如,考虑:
您可能认为这涉及三个字符串对象——一个用于每个文本,一个用于连接。事实上,它只涉及一个,因为编译器在编译时执行串联,所以代码有效: