【问题标题】:Comparing java Strings with == [duplicate]将java字符串与==进行比较[重复]
【发布时间】:2011-10-19 21:51:05
【问题描述】:

可能重复:
Java String.equals versus ==

是否可以使用 == 运算符比较 Java 字符串?

为什么我经常看到,用equals()方法代替?

是因为在与文字字符串(如“Hello”)进行比较时,使用 == 并不意味着调用 equals()?

【问题讨论】:

标签: java string operator-overloading equals


【解决方案1】:

java 中没有 custom 运算符重载。 [所以你不能重载它来调用equals()]

equals() 确保您检查 2 个对象是否相同,而 == 检查这是否是完全相同的对象。 [所以不,使用 == 不会调用 equals()]。

【讨论】:

  • 没有 custom 运算符重载。 Java 语言重载了一些运算符(+ 可以表示数字加法或字符串连接,| 可以表示按位或或逻辑非快捷方式或)。
  • @Joachim:同意,我认为 OP 对自定义运算符重载感兴趣,所以我没有明确提及。感谢您的评论。我编辑了我的答案。
【解决方案2】:

== 检查两个对象是否引用一个对象的同一个实例,而equals() 检查两个对象是否实际上等价,即使它们不是同一个实例。

【讨论】:

    【解决方案3】:

    不,这是不可能的,因为使用 == 您比较的是对象引用而不是字符串的内容(您需要使用 equals)。

    【讨论】:

      【解决方案4】:

      为了扩展@amit 的答案,== 运算符只能用于值类型(int、double 等)。 String 是一种引用类型,因此应该与 .equals() 方法进行比较。在引用类型上使用 == 运算符检查 java 中的引用相等性(意味着两个对象引用都指向相同的内存位置。)

      【讨论】:

        【解决方案5】:

        String 是一个类。因此,如果您尝试将 String 与其持有字符串值的对象进行比较,则不能使用 == 因为它正在寻找对象。对于比较对象的内容,您必须使用等于

        【讨论】:

          【解决方案6】:

          Operator == 比较字符串对象引用,而 String.equals 方法检查对象引用 + 对象值。此外,String.equals 方法在其实现中又使用 == 运算符。

          【讨论】:

            【解决方案7】:

            据我所知,'==' 运算符用于检查对象是否相同。
            假定的比较字符串可能具有相同的值(字符的 nr 等),但实际上是两个完全不同的对象,因此导致比较错误。

            【讨论】:

              【解决方案8】:

              在 Java 中,不能重载运算符。 == 运算符执行身份相等。另一方面,equals(...) 方法可以被覆盖以进行特定于类型的比较。

              这里有一段代码sn-p来演示:

              String a = "abcdef";
              String b = a;
              String c = new String(a);
              
              println(a == b); // true
              println(a.equals(b)); // true
              
              println(a == c); // false
              println(a.equals(c)); // true
              

              一个复杂的问题是equals(...) 你也需要关心null。所以正确的 null-safe 习惯用法是:

              (a == null ? b == null : a.equals(b))
              

              这是一个你不必在 C# 中跳过的循环

              【讨论】:

                【解决方案9】:

                正如 amit 已经说过的,== 检查是否是同一个对象,而 equals() 检查相同的内容(好吧,基本实现等于 == 但 String 会覆盖它)。

                注意:

                "Hello" == "Hello" //most probably would be true
                "Hello".equals( "Hello" ) //will be true
                
                String s1, s2; //initialize with something different than a literal, e.g. loading from a file, both should contain the same string
                s1 == s2 //most probably will NOT be true
                s1.equals( s2) //will be true, if both contain the same string, e.g. "Hello"
                

                除此之外,原语的对象包装器也是如此,例如

                 Long l1 = 1L;
                 Long l2 = 1L;
                 l1 == l2 //will most likely be true for small numbers, since those literals map to cached instances
                 l1.equals(l2) //will be true
                
                 new Long(1) == new Long(1) //will NOT be true
                 new Long(1).equals(new Long(1)) //will be true
                

                【讨论】:

                • -1: 1L 是原始 long 和 1L.equals(1L) 是无效的 Java 语法(对原始类型的方法调用没有装箱)[好吧,如果我达到 125 声望我将投票否决:P]
                • @pmnt 你是对的,更新了答案。
                【解决方案10】:

                == 如果内存地址两边相等,则返回 true,原始类型除外。

                equals 应该用在所有不是原始的东西上。主要部分的类。

                【讨论】:

                  【解决方案11】:

                  == 运算符检查对象的位模式而不是这些对象的内容,但 equals 函数比较对象的内容。

                  String str1=new String("abc");
                  String str2=new String("abc");
                  

                  System.out.println(str1==str2);将返回 false 因为 str1 和 str2 是用 "new" 创建的不同对象。 System.out.println(str1.equals(str2)) 将返回 true,因为 equals() 检查对象的内容。

                  【讨论】:

                    猜你喜欢
                    • 2021-07-10
                    • 1970-01-01
                    • 2012-11-27
                    • 2018-08-23
                    • 1970-01-01
                    • 2017-02-20
                    • 2010-10-06
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多