【问题标题】:Why is this string comparison working? [duplicate]为什么这个字符串比较有效? [复制]
【发布时间】:2015-04-30 13:47:45
【问题描述】:

我知道,在 Java 中,通常应该使用 .equals() 方法比较两个字符串,而使用 == 仅比较内存位置。但是,我在 Eclipse 中快速编写了这个测试代码,它返回了 true,我正在使用的任何人都无法弄清楚原因。 Java 是否更新以支持字符串的直接比较,只是没有人意识到还是我们疯了? Stack Overflow 不允许我发布控制台的图片,但它打印出来是真的。

代码如下:

    public class Thing {
        public static void main(String[] args){
            String ar = "fish";
            String ar2 = "fish";
            System.out.println(ar == ar2);
        }
    }

【问题讨论】:

  • 编译器可能看到了优化。没有理由将字符串文字存储两次。因此,它们具有相同的引用。
  • 看起来编译器可能已经为你保留了字符串
  • 导致智能java编译器不会两次创建相同的字符串。
  • 重复中的顶级答案讨论了此比较成功的原因。

标签: java string memory string-comparison


【解决方案1】:

Cameron:因为这里它们都指向内存中的同一个地址。这并不意味着当您像这样比较具有相同值的两个字符串时总会发生这种情况。

【讨论】:

    【解决方案2】:

    字符串存储在字符串池中,当您声明具有相同值的新字符串时,它将引用现有字符串。这就是它返回 true 的原因。

    【讨论】:

    • 错了。非常错误。只是尝试运行上面的代码,但添加: String tester = new String("fish"); System.out.println(ar == tester);你会看到你的错误。
    • “字符串存储在字符串池中”只是部分正确。您需要更精确地确定哪些字符串(因为并非所有字符串都是),最好是它们的放置方式。
    • 感谢您的反馈,我不知道有什么不同。刚刚在stackoverflow.com/questions/2486191/java-string-pool得到了很好的解释
    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 2013-07-16
    • 2013-10-20
    • 1970-01-01
    • 2013-02-27
    • 2015-07-06
    • 2012-04-12
    • 2022-03-30
    相关资源
    最近更新 更多