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

时间:2014-01-10 15:39:49

标签: java string scjp

我正在学习并为Java SE 6认证做好准备。我使用Kathy Sierra和Bert Bates的书“Sun认证程序员Java 6学习指南”。我实际上在Strings,I / O和Parsing。

他们提出了一个我可能期望在考试中看到的那种恶魔字符串问题的例子:

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

输出是什么?对于额外的功劳,有多少String对象以及如何使用   在println语句之前创建了许多引用变量吗?

     

答案:此代码片段的结果是春冬春天   夏季。有两个参考变量,s1和s2。有一个   共创建了八个String对象:“spring”,“summer”   (失去的),“春夏”,“堕落”(迷失),“春天的堕落”(迷失),“春天   夏天的春天“(迷失),”冬天“(迷失),”春天的冬天“(此时此刻   “春天”失去了)。八个String对象中只有两个不会丢失   在这个过程中。

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

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

当他们这样做的时候算了:

  

s1.concat(“fall”);

那么,为什么不呢:

  

s1.concat(s1 +“”+ s2);

或真实的,这个:

  

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

1 个答案:

答案 0 :(得分:4)

由于操作词之前的声明:'

prior to the println statement

如您所述,String之前(之前)创建了8个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

注意:“created”并不意味着在代码的这一点上创建,只是这段代码会要求创建它。