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

加布里埃尔·BB

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

他们提供了一个我可能希望在考试中看到的那种恶魔般的String问题的示例:

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

输出是什么?为了获得额外的荣誉,在println语句之前创建了多少个String对象和多少个引用变量?

答:此代码片段的结果是spring winter spring summer。有两个参考变量s1和s2。总共创建了八个String对象,如下所示:“ spring”,“ summer”(丢失),“ spring summer”,“ fall”(丢失),“ spring fall”(丢失),“ spring summer spring”(丢失) ),“冬天”(丢失),“春天冬天”(此时“春天”丢失)。在此过程中,八个String对象中只有两个不会丢失。

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

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

当他们这样做时,它很重要:

s1.concat(“ fall”);

所以,为什么不这样:

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

或真正的一个,这是:

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

罗斯·德鲁

由于声明中带有可操作词before

prior to the println statement

Stringprintln您所描述的之前(之前)创建了8个对象另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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法创建一个接受两个字符串数组并将这些字符串作为两个参数传递给函数的 UDF?

来自分类Java

Java中的字符串常量池中两个字符串的串联

来自分类Dev

串联字符串:两个字符串列表的“乘法”

来自分类Dev

为什么通过计算字符的异或比较两个字符串?

来自分类Dev

通过两个字符串对象创建日期/时间对象

来自分类Dev

为什么用 `>` 比较两个字符串不会抛出错误?

来自分类Dev

将具有两个字符串参数的对象转换为逗号分隔的字符串

来自分类Dev

比较两个字符串对象以获取匹配的字符串

来自分类Java

我想拆分字符串而不创建两个字符串

来自分类Java

为什么经过两个字符串参数不是一个列表的说法更高效

来自分类Dev

为什么在两个字符串之间添加空格以合并c中的字符串?

来自分类Dev

为什么这两个字符串不相等?

来自分类Dev

为什么Mysql中的两个字符串相同?

来自分类Dev

为什么我的if语句说两个字符串不在列表中?

来自分类Dev

Golang为什么这两个字符串不相等?

来自分类Dev

为什么这两个字符串==但不是===

来自分类Dev

为什么这两个字符串比较返回不同的结果?

来自分类Dev

为什么在尝试比较两个字符串时出现分段错误?

来自分类Dev

为什么SQL不匹配两个字符串?

来自分类Dev

为什么两个字符串可以比较相等?

来自分类Dev

为什么while(* s ++ == * t ++)无法比较两个字符串

来自分类Dev

为什么这两个字符串不相等?

来自分类Dev

为什么两个字符串完全相同但不匹配?

来自分类Dev

在剃刀视图中串联两个字符串

来自分类Dev

在r中串联两个字符串变量

来自分类Dev

如何通过串联两个字符串在Shell脚本中调用别名?

来自分类Dev

如何在C中串联两个字符串宏?

来自分类Dev

从cin读取两个字符串并将其写回时的意外行为

来自分类Dev

连接两个字符串并将其打印在标签上 c# wpf

Related 相关文章

  1. 1

    有没有办法创建一个接受两个字符串数组并将这些字符串作为两个参数传递给函数的 UDF?

  2. 2

    Java中的字符串常量池中两个字符串的串联

  3. 3

    串联字符串:两个字符串列表的“乘法”

  4. 4

    为什么通过计算字符的异或比较两个字符串?

  5. 5

    通过两个字符串对象创建日期/时间对象

  6. 6

    为什么用 `>` 比较两个字符串不会抛出错误?

  7. 7

    将具有两个字符串参数的对象转换为逗号分隔的字符串

  8. 8

    比较两个字符串对象以获取匹配的字符串

  9. 9

    我想拆分字符串而不创建两个字符串

  10. 10

    为什么经过两个字符串参数不是一个列表的说法更高效

  11. 11

    为什么在两个字符串之间添加空格以合并c中的字符串?

  12. 12

    为什么这两个字符串不相等?

  13. 13

    为什么Mysql中的两个字符串相同?

  14. 14

    为什么我的if语句说两个字符串不在列表中?

  15. 15

    Golang为什么这两个字符串不相等?

  16. 16

    为什么这两个字符串==但不是===

  17. 17

    为什么这两个字符串比较返回不同的结果?

  18. 18

    为什么在尝试比较两个字符串时出现分段错误?

  19. 19

    为什么SQL不匹配两个字符串?

  20. 20

    为什么两个字符串可以比较相等?

  21. 21

    为什么while(* s ++ == * t ++)无法比较两个字符串

  22. 22

    为什么这两个字符串不相等?

  23. 23

    为什么两个字符串完全相同但不匹配?

  24. 24

    在剃刀视图中串联两个字符串

  25. 25

    在r中串联两个字符串变量

  26. 26

    如何通过串联两个字符串在Shell脚本中调用别名?

  27. 27

    如何在C中串联两个字符串宏?

  28. 28

    从cin读取两个字符串并将其写回时的意外行为

  29. 29

    连接两个字符串并将其打印在标签上 c# wpf

热门标签

归档