字符串常量池机制

时间:2014-07-02 08:29:39

标签: java string

任何人都可以解释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

4 个答案:

答案 0 :(得分:6)

您需要了解str.equals(other)str == other之间的区别。前者检查两个字符串是否具有相同的内容。后者检查它们是否是相同的对象"hello" + "hello""hellohello"可以在编译时优化为相同的字符串。 "hello" + s2将在运行时计算,因此将是一个与"hellohello"不同的新对象,即使其内容相同。

编辑:我刚注意到你的头衔 - 连同用户3580294的评论,看来你应该已经知道了。如果是这样,那么唯一可能存在的问题是为什么一个被认为是常数而另一个不被认可。正如一些评论者建议的那样,使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的工作原理如下:

更多信息:

答案 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的引用将彼此相等。