首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么连接两个String并将其作为参数传递不会创建一个新的String对象?

为什么连接两个String并将其作为参数传递不会创建一个新的String对象?
EN

Stack Overflow用户
提问于 2014-01-10 15:39:49
回答 1查看 1.7K关注 0票数 3

我正在学习并为Java 6认证做好准备。我正在使用凯西塞拉和伯特贝茨的书“太阳认证程序员为Java 6学习指南”。我实际上在Strings,I/O和解析。

它们提供了一个例子,说明了我在考试中可能会看到的那种邪恶的字符串问题:

代码语言:javascript
复制
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

输出是什么?另外,在println语句之前创建了多少字符串对象和引用变量? 答:这个代码片段的结果是春、冬、春、夏。有两个参考变量,s1和s2。一共创造了八个字符串对象:“春”、“夏”(失)、“春夏”、“秋”(失)、“春秋”(失)、“春夏春”(失)、“冬”(失)、“春冬”(此时“春”失)。在此过程中,八个字符串对象中只有两个没有丢失。

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

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

当他们这么做的时候,这是很重要的:

S1.凹(“坠落");

那么,为什么不这样:

(s1+“”+ s2);

或者真正的那个,这个:

System.out.println(s1 +“”+ s2);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-10 16:02:49

因为语句中包含了“优先”一词:‘

prior to the println statement

正如您所描述的,在String之前(之前)创建了8个println对象。在println" "spring winter spring summer上又创建了2个

代码语言:javascript
复制
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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21048360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档