5

所以我正在为 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 是用空格连接的,这不也会创建新对象吗?还是只是将其传递给字符串缓冲区进行显示,而不是创建新对象?

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

提前致谢!

4

2 回答 2

5

我的问题是,在最后一行代码中,由于 s1 和 s2 是用空格连接的,这不是也创建了新对象吗?

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

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

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

  • 5 个字面量:“spring”、“summer”、“fall”、“winter”和“”
  • 5 个连接结果:s1 + "summer", s1.concat("fall "), s1 + winter(带有复合赋值)和s1 + " " + s2.

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

String x = "Foo" + "Bar";

您可能期望这涉及三个字符串对象 - 一个用于每个文字,一个用于连接。其实只涉及一个,因为编译器是在编译时进行拼接的,所以代码实际上是:

String x = "FooBar";
于 2013-05-22T11:07:03.263 回答
2

我将回答另一个更清晰的问题:以下代码片段中涉及多少个 String 实例:

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat( "fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1+" "+s2);
  1. 字符串文字“弹簧”
  2. 字符串文字“夏天”
  3. s1 和“summer”的串联
  4. 字符串文字“fall”
  5. s1 和 "fall" 的串联
  6. s2 和 s1 的串联
  7. 字符串文字“冬天”
  8. s1 和“冬天”的连接
  9. 字符串字面量 ” ”
  10. sysout 中 s1 和 s2 的串联

所以总共10个。

于 2013-05-22T11:11:05.010 回答