【发布时间】:2018-04-27 18:20:56
【问题描述】:
如果池内存已经有一个内容相似的对象,那么如果我们尝试用不同的引用变量创建同一个对象,那么只会创建一个新的引用变量,没有新的对象被创建。例如;
String s7="1";
String s8 ="1";
System.out.print(s7==s8); //True
这里只创建了一个对象。 但在下面的例子中
public class JavaApplication1 {
public static void main(String[] args) {
String s1 = "1", s2 = "2", s4 = s1 + s2, s5 = "12";
final String s3 = s1 + s2;
s1 += s2;
System.out.print((s1 == s3) + "" + (s1 == s5) + "" + "" (s3 == s5));
}
}
输出为假假假 Even is s3 被声明为最终表达式!,为什么?
【问题讨论】:
-
因为
s1和s2不是吗?这与“增量”有什么关系? -
+= 就像在 s1+=s2;
-
AFAIK,编译器只实习明显的情况 - 直接字符串常量及其连接。在运行时处理其他任何内容。
-
@Krishnan no:编译时常量是最终的,但最终值并不总是编译时常量。考虑
final String s = "" + System.currentTimeMillis();:无法在编译时进行评估。