Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.out.println中使用的字符串是否也会创建新的不可变对象?_Java_String_Immutability_Scjp_System.out - Fatal编程技术网

Java System.out.println中使用的字符串是否也会创建新的不可变对象?

Java System.out.println中使用的字符串是否也会创建新的不可变对象?,java,string,immutability,scjp,system.out,Java,String,Immutability,Scjp,System.out,所以我在为凯西·塞拉的书中的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

所以我在为凯西·塞拉的书中的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?
输出是春天冬天春天夏天,有两个参考变量,这很好

然后它说创建了八个字符串对象(spring、summer、spring-summer…等等),包括那些由于没有引用而丢失的字符串对象

但是,它不包括上一个sysout中的任何内容

我的问题是,在最后一行代码中,由于s1和s2是用空格连接的,这不也会创建新对象吗?或者只是将其传递到字符串缓冲区进行显示,而不是创建新对象

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

提前谢谢

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

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

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

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

  • 5个字:“春”、“夏”、“秋”、“冬”和“
  • 5个串联结果:
    s1+“夏季”
    s1.concat(“秋季”)
    s1+winter
    (带复合赋值)和
    s1+“+s2
正如我刚才所评论的,代码中出现的字符串文字并不总是包含单独的字符串。例如,考虑:

String x = "Foo" + "Bar";
您可能希望这涉及三个字符串对象——一个用于每个文本,一个用于连接。事实上,它只涉及一个,因为编译器在编译时执行级联,所以代码有效地:

String x = "FooBar";

我将回答另一个更清楚的问题:以下代码段中涉及多少字符串实例:

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat( "fall ");
s2.concat(s1);
s1 += "winter";
System.out.println(s1+" "+s2);
  • 字符串文字“spring”
  • 字符串文字“summer”
  • s1和“summer”的串联
  • 字符串文字“fall”
  • s1和“下降”的串联
  • s2和s1的串联
  • 字符串文字“冬季”
  • s1和“冬季”的串联
  • 字符串文字“”
  • sysout中s1和s2的串联

  • 总共10个。

    编译上面的代码,将其输入到
    javap-c
    ,并检查编译的字节码。应该是一个隐式的
    StringBuffer
    ,它最终得到对其调用的
    toString()
    ,这应该可以回答问题。(还有,这个问题就像认证中的所有错误一样。创建引用变量意味着什么?它们是编译时构造,充其量是声明的。还有创建字符串文本时产生的歧义——它们肯定是在字符串操作的结果之前创建的。)运行。)@millimoose我认为这些问题是为了测试你对对象实例化、jvm和字符串常量的了解——所有这些都是非常有效的领域:)@vikingsteve它们可能设计得很好,但设计得很糟糕。常量池中的字符串不是由相关代码创建的;它们有一个完全独立的生命周期。这个问题是一个说教式的噩梦,我也不是第一次看到SCJP的质量如此之低。@vikingsteve我并不是说在认证的细节层次上了解细节的本质是毫无价值的。我是说,这个问题,用词来说,是模糊的,模棱两可的,基本上相当于弄清楚作者在想什么。基本上,如果按原样询问SCJP问题(即OP没有要求澄清问题的特定部分),则可能会将其掩埋并关闭。这意味着您在准备认证时不太可能很好地学习这些概念,这意味着认证不是一个很好的知识指示器。您的意思是,如果它们存在于字符串常量池中,它们将不会被正确地重新创建?它不会产生五个字符串吗?包括最后一行代码中的空格-“”那么这本书说它创建字符串对象的确切含义是什么?它是指9个字符串对象,但只有5个字符串文本吗?除非你说new(),在这种情况下将创建一个副本。@nilay9999:你完全正确:我算错了。有10根弦;5个文本(
    “spring”
    “summer”
    “fall”
    “winter”
    “winter”
    )和5个串联结果(
    s1+“summer”
    s1.concat(“fall”)
    s1+winter
    (带复合赋值)和
    s1+“+s2
    )。@JonSkeet如果您不介意的话,你能解释一下我是如何代表性地思考字符串、字符串对象和字符串文字的吗?如果我错了,请纠正我:当使用新字符串(“abc”)时,它会创建一个无法插入的字符串。这将是一个字符串对象,但abc将是文本值?我现在有点困惑!我想答案漏掉了评论中的一个concat:-)谢谢你-我正要请Jon Skeet将此添加到他的答案中。非常有帮助。@AndrewMartin:正如OP所指出的,还有“”-总共有10个。我第一次也错过了。@JonSkeet:有趣的是,我只是对那一次挠头而已。现在有道理了,干杯。谢谢Aniket,是的@JonSkeet已经纠正了这一点。不过,谢谢你提供的细节!还要注意,字符串连接编译成的内容依赖于java编译器,也可以编译成
    s1.concat(“”.concat(s2)
    。这是这种考试的另一种方式