我正在学习并准备获得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
String
在println
您所描述的之前(之前)创建了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] 删除。
我来说两句