gpt4 book ai didi

java - 为什么连接两个字符串并将其作为参数传递不会创建新的字符串对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:42 28 4
gpt4 key购买 nike

我正在学习并准备获得 Java SE 6 认证。我正在使用 Kathy Sierra 和 Bert Bates 的书“Sun Certified Programmer for Java 6 Study Guide”。我实际上在研究字符串、I/O 和解析。

他们提供了一个我可能希望在考试中看到的那种糟糕的字符串问题示例:

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

What is the output? For extra credit, how many String objects and how many reference variables were created prior to the println statement?

Answer: The result of this code fragment is spring winter spring summer. There are two reference variables, s1 and s2. There were a total of eight String objects created as follows: "spring", "summer " (lost), "spring summer", "fall" (lost), "spring fall" (lost), "spring summer spring" (lost), "winter" (lost), "spring winter" (at this point "spring" is lost). Only two of the eight String objects are not lost in this process.

我在标题中的问题非常具体。如您所见,他们说总共有 8 个 String 对象,但是,在 println 方法调用时发生了什么?它传递一个 String 对象引用作为参数,因此,s1 加上 s2 的值应该创建另一个 String 对象,因为它是不可变的,将计数增加到 9。

但是(可能更多)s1 和 s2 之间的空字符串 ("") 不应该创建其他对象,将计数增加到 10 吗?

当他们这样做时才算数:

s1.concat("fall ");

那么,为什么不这样:

s1.concat(s1 + " " + s2);

或者真正的,这个:

System.out.println(s1 + " " + s2);

最佳答案

因为带有操作词 prior 的语句:'

在 println 语句之前

8 String 对象是在您描述的 println 之前(之前)创建的。另外 2 个是在 println 上创建的,""spring winter spring summer

String s1 = "spring ";             // "spring" created, reference s1 changed
String s2 = s1 + "summer "; // "summer", "spring summer" created, "summer" not saved, reference s2 changed
s1.concat("fall "); // "fall", "spring fall" created but not saved
s2.concat(s1); // "spring summer spring" created but not saved
s1 += "winter "; // "winter", "spring winter" created, reference s1 changed
System.out.println(s1 + " " + s2); //" ", "spring winter spring summer" created, " " not saved

注意:“创建”并不意味着在代码中此时创建,只是这段代码会要求创建它。

关于java - 为什么连接两个字符串并将其作为参数传递不会创建新的字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21048360/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com