任何人都可以解释String
s的这种奇怪行为吗?
这是我的代码:
String s2 = "hello";
String s4 = "hello"+"hello";
String s6 = "hello"+ s2;
System.out.println("hellohello" == s4);
System.out.println("hellohello" == s6);
System.out.println(s4);
System.out.println(s6);
输出结果为:
true
false
hellohello
hellohello
答案 0 :(得分:6)
您需要了解str.equals(other)
和str == other
之间的区别。前者检查两个字符串是否具有相同的内容。后者检查它们是否是相同的对象。 "hello" + "hello"
和"hellohello"
可以在编译时优化为相同的字符串。 "hello" + s2
将在运行时计算,因此将是一个与"hellohello"
不同的新对象,即使其内容相同。
s2
final会改变行为,因为编译器可以相信s2
以"hello"
的方式保持不变,并且可以解析"hello" + s2
在编译时。
答案 1 :(得分:5)
String s2 = "hello";
String s4 = "hello" + "hello"; // both "hello"s are added and s4 is resolved to "hellohello" during compile time (and will be in String pool)
String s6 = "hello"+ s2; // s6 is resolved during runtime and will be on heap (don't apply Escape analysis here)
所以,
System.out.println("hellohello" == s4); // true
System.out.println("hellohello" == s6); // false
答案 2 :(得分:5)
"hello" + s2
的工作原理如下:
+
运算符实际调用StringBuilder#append(String s)方法"hellohello" == s6
实际为false
。更多信息:
答案 3 :(得分:2)
字符串s4
被实习并且对此字符串的引用与“hellohello”相同。
因此,您可以获得true
:
System.out.println("hellohello" == s4);
字符串s6
未实现,取决于 变量 s2
。对“hellohello”和字符串s6
的引用并不相同。因此,您可以获得false
:
System.out.println("hellohello" == s6);
但是,如果您将s2
声明为最终,这会使s2
保持不变,那么您将获得true
而不是false
{ {1}},因为现在编译器可以实现字符串System.out.println("hellohello" == s6);
,因为它依赖于常量值,并且对“hellohello”和s6
的引用将彼此相等。