有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

系统中使用的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) 个答案

  1. # 1 楼答案

    My question is, in the last line of code, since s1 and s2 are being concat with a space, doesn't this also create new objects?

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

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

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

    • 5个字:“春”、“夏”、“秋”、“冬”和“
    • 5个串联结果:s1 + "summer"s1.concat("fall ")s1 + winter(带复合赋值)和s1 + " " + s2

    正如我刚才所评论的,代码中出现的字符串文本并不总是包含一个单独的字符串。例如,考虑:

    String x = "Foo" + "Bar";
    

    您可能认为这涉及三个字符串对象——一个用于每个文本,一个用于连接。事实上,它只涉及一个,因为编译器在编译时执行串联,所以代码有效:

    String x = "FooBar";