【问题标题】:String concatenation ambiguity字符串连接歧义
【发布时间】:2018-11-11 03:12:51
【问题描述】:

我有以下简单的 java 代码,我试图了解 java 中的字符串连接是如何使用 '+' 运算符工作的。

public class Problem {

public static void main(String... args){

    String str1 = "abc";
    String str2 = "ab";
    String str3 = "c";
    String str4 = "ab" + "c";//This will use of  StringBuilder class for concatenation and return new String object
    String str5 = str2 + str3;//This will use of  StringBuilder class for concatenation and return new String object

    System.out.println(str1 == str4); // This  returns true
    System.out.println(str1 == str5); // This  returns false

}
}

str4 是 2 个字符串文字(abc)的结果,str5 是对 2 个字符串文字(str2str3)的引用。在这两种情况下,java 都会调用 StringBuilder 类来执行连接。

而且我相信它应该会导致在 java 堆空间中创建 2 个不同的 StringBuilder 对象。

如果我的理解是正确的,为什么 str1 == str4 返回 true ?有人可以帮我弄清楚吗?

问候, 马尼什·夏尔马

【问题讨论】:

标签: string concatenation string-literals


【解决方案1】:

这取决于编译器和 jvm 将如何优化它。只有当两个变量都被优化为指向同一个地址时,评估才会成立。一般来说,使用 == 比较字符串是不可靠的。请改用“等于”方法。

【讨论】:

  • 所以上面程序的输出对于不同的JVM可能会有所不同,对吗?
  • 我对这个规范不是 100% 确定的。但在实践中,是的。新变量的地址应被视为非确定性的。
  • 另一个注意事项:jvm可能通过将它们的变量指向相同的地址来优化不可变对象(尤其是字符串)。但你无法控制它。另外,我想在占用的地址空间中搜索相等的对象是昂贵的。我不知道它在哪些情况下可以做这些优化。
  • 感谢 Pascal 提供的更多信息!我仍然想知道我是否将上述问题作为一个客观问题,我的猜测应该是什么?如果我到目前为止的解释是我遇到了字符串连接的工作原理,我的答案是false for str1 == str4 但不是这样:)!
  • 浏览时发现stackoverflow中的一篇文章,其中一个cmet提到了以下内容。如果你简单地写“ab”+“c”,Java编译器将在编译时执行连接并且生成的代码将完全相同。这仅在编译时已知所有字符串的情况下才有效。如果任何字符串是变量并且无法由编译器确定,则它将具有不同的结果哈希码
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多