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正在与空格连接,这是否也会创建新对象?或者它只是传递给字符串缓冲区进行显示,而不是创建新对象?
这显然是非常基本的,我看了别处,但没有直接回答这个问题.根据我的理解,它也应该在那里创建新的对象,但我需要确保参加考试!思考?
提前致谢!
我的问题是,在最后一行代码中,由于s1和s2正在与空格连接,这是否也会创建新对象?
是的,它创建了第10个字符串.
请注意,这段代码本身只需要创建 5个字符串 - 如果在同一个JVM中多次运行它,每次调用它时都会创建5个新字符串.每次代码运行时,字符串文字都不会创建新字符串.("spring "例如,每次都重复使用相同的字符串对象.)
您给出的代码中有10个字符串:
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)