【问题标题】:Why is "F" + "alse" not == "False"? [duplicate]为什么“F”+“alse”不是==“False”? [复制]
【发布时间】:2012-12-29 14:58:49
【问题描述】:

可能重复:
How do I compare strings in Java?

我不明白为什么声明的变量不一样。

前代码:

 String firstPart = "F";
 String whole = "False";
 String connected = firstPart + "alse";
 System.out.println(connected == whole);

现在这会产生一个布尔值,我认为它会是“真”,但事实并非如此,结果是假的,我不明白为什么。

谁能解释一下?

【问题讨论】:

  • +1。如果您不了解equals(),这是一个足够公平的问题,尽管使用“False”作为示例会混淆问题(人们可能会认为您想将字符串与布尔值进行比较)
  • 这是一个常见的错误。但是这个问题可能已经在 SO 上被问过数千次了。
  • 感谢您抽出宝贵时间!非常感谢!
  • 如果您将firstPart 设为final,它将是同一个对象,因此== 将为真。否则只有 contents 是相同的,所以你必须使用equals
  • Java 中的字符串是不可变的。所以字符串 a + 字符串 b 永远不会 == 字符串 c。很可能 (string a + string b) 将被分配到栈上,而 string c 将在字符串池中。

标签: java string-comparison


【解决方案1】:

您是在比较参考,而不是值。

您需要使用equals:

connected.equals(whole);

【讨论】:

    【解决方案2】:

    这个

    String connected = firstPart + "alse";
    

    创建一个 new String 对象,其中包含一个新的底层 char 数组和一个新的引用。

    因此,当您比较参考文献(使用 '=='')时,您将无法找到匹配项。如果您使用equals() 比较实际对象内容,那么您将得到您想要的结果(因为String.equals() 比较底层字符数组的内容)

    【讨论】:

    • 只是因为其他人会看到这一点,由于 String interning,如果你将 String assignments final,那么 (connected == whole) 确实是真的。
    【解决方案3】:

    您应该使用equals() 比较字符串。像这样:

    System.out.println(connected.equals(whole));

    【讨论】:

      【解决方案4】:

      当您使用“==”来比较字符串时,这意味着您想要比较它们的参考值而不是它们的值,在这种情况下将返回 false。

      您需要使用equals 方法,该方法将根据字符串所持有的值比较字符串..

      【讨论】:

        【解决方案5】:

        你应该使用 .equals() 方法来比较字符串...

        【讨论】:

          【解决方案6】:

          基本上,只有 PDT 可以用 == 检查。这些是 byte、short、int、long、float、double、boolean、char,当然还有引用。由于您获得的两个引用是不同的对象,因此结果将是错误的。

          对于任何 ADT(或对象),您必须使用 equals() 方法。所有 Java 对象都有它们,您也必须为自己的对象实现它。对于 String 对象,这已为您完成,并比较字符以测试相等性。

          【讨论】:

            【解决方案7】:

            Java 不是 JavaScript - 比较运算符不同:

            在java中==的意思是“这两个对象是相同的实例吗?”,对应于JavaScript的===操作符。

            在java中.equals() for String的意思是“字符是否相同”,对应JavaScript的==操作符。

            【讨论】:

              【解决方案8】:

              经验法则:== 比较对象引用,而不是对象值。覆盖equals 是定义对象之间相等性的标准方法(包括String,因为它是一个类,而不是原语)。

              firstPartwholeconnected 分别定义了一个新的 String,因此即使 connectedwhole 在池中匹配相同的 String,它们的引用也不同,因为 ==不会考虑价值。

              【讨论】:

                猜你喜欢
                • 2012-02-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-09-30
                • 2018-10-17
                • 1970-01-01
                • 2017-03-01
                • 1970-01-01
                相关资源
                最近更新 更多