我正在学习并为Java 6认证做好准备。我正在使用凯西塞拉和伯特贝茨的书“太阳认证程序员为Java 6学习指南”。我实际上在Strings,I/O和解析。
它们提供了一个例子,说明了我在考试中可能会看到的那种邪恶的字符串问题:
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);
发布于 2014-01-10 16:02:49
因为语句中包含了“优先”一词:‘
prior to the println statement
正如您所描述的,在String之前(之前)创建了8个println对象。在println、" "和spring winter spring summer上又创建了2个
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注意:“创建”并不意味着此时在代码中创建,只是这段代码将要求创建它。
https://stackoverflow.com/questions/21048360
复制相似问题