【问题标题】:Java string == Vs Equals giving true or false when combined with concatenation [duplicate]Java字符串== Vs Equals与连接结合时给出真或假[重复]
【发布时间】:2014-02-05 18:30:54
【问题描述】:

我肯定错过了什么

public static void main(String []args){
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 ==  s2);//gives true
}

public static void main(String []args){
    String s1 = "abc";
    String s2 = "abc";
    System.out.println("s1 == s2 is:" + s1 ==  s2); //gives false
 }

与运算符优先级有关??

【问题讨论】:

  • 附带说明,不要将字符串与== 进行比较,请使用equals(String)equalsIgnoreCase(String)
  • 虽然在这种情况下,如果您添加括号,它按预期工作,因为您正在比较字符串常量(JLS 保证为 == if他们是equals)。
  • 请注意那些回答“不要使用== 来比较字符串”的人:看起来这似乎是预期的行为,是对 Java 中(内部)字符串常量的调查。

标签: java


【解决方案1】:

是的,+ operator is of higher precedence than ==,因此您将字符串 "s1 == s2 is:abc""abc" 进行比较。您始终可以使用括号来强制执行明确的操作顺序。

【讨论】:

    【解决方案2】:

    是的。评价为:

    ("s1 == s2 is:" + s1) ==  s2
    

    【讨论】:

      【解决方案3】:

      正如其他人回答的那样,“+”运算符的优先级高于“==”。如果将比较括在括号中,例如

         System.out.println("s1 == s2 is"+(s1 == s2)); 
      

      由于括号的优先级高于+,因此上述语句将成立。

      如果你觉得为什么字符串 s1 和 s2 指的是同一个内存位置,那是因为字符串字面量池的概念。

      【讨论】:

        【解决方案4】:

        老兄,你不应该使用 == 进行字符串比较,而是使用 equals 方法。

        string1.equals(string2)
        

        【讨论】:

        • 这通常是正确的,但在这种情况下它不是答案。首先,运算符优先级使其成为一个有争议的问题;其次,如果您修复了运算符优先级(通过添加括号),它将打印s1 == s2 is:true,因为 OP 正在比较字符串常量。
        • == for string 被重载以检查基础值。老兄 s1 不是字符串 s1 = new String("abc")
        • 这根本不能回答问题。
        • @user1635354 不,字符串不会超载==。在 Java 中没有任何东西可以重载 ==。它比较对象的引用相等性,就像它对任何引用类型所做的一样。
        【解决方案5】:

        + 操作员比 == 具有更高的精度,因此您正在执行“s1 == s2 is:abc”到“abc”。

        请注意,始终使用 equal 或 equalIgnoreCase 比较字符串,因为 == 始终比较引用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-19
          • 2018-06-12
          • 2014-10-25
          • 2014-02-17
          • 2015-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多