【问题标题】:What's the difference between ".equals" and "=="? [duplicate]“.equals”和“==”有什么区别? [复制]
【发布时间】:2010-12-11 05:07:30
【问题描述】:

我今天换了讲师,他用一个奇怪的代码对我说。 (他说最好使用.equals,当我问为什么时,他回答“因为它是!”)

下面是一个例子:

if (o1.equals(o2))
{
 System.out.println("Both integer objects are the same");
}

而不是我习惯的:

if (o1 == o2)
{
  System.out.println("Both integer objects are the same");
}

这两者有什么区别。为什么他的方式(使用.equals)更好?

Found this 快速搜索,但我无法真正理解这个答案:

【问题讨论】:

  • 这已被多次询问。 stackoverflow.com/questions/971954/…
  • 猜错地方了
  • 由于 C# 和 Java 在这里的行为方式并不完全相同,我认为每种语言都有一个问题是合理的。
  • 我引用的答案包括Java C#,这是一件好事:)
  • 没有讲师应该满足于给出这样的答案,你也不应该。

标签: java equals


【解决方案1】:

以下是对您的问题的简单解释:

==(等于)用于计算算术表达式

在哪里

用于比较字符串的equals()方法

因此,最好使用 == 进行数值运算,使用 equals() 方法进行字符串相关的运算。因此,对于对象的比较,equals() 方法将是正确的选择。

【讨论】:

  • 与问题中的字符串无关。
  • @EJP 我只是试图解释 == & equals() 方法的含义。
【解决方案2】:

== 运算符比较两个对象引用以检查它们是否引用相同的实例。这也将在成功匹配时返回 true。例如

public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2)     //true
test(s1 == s3)      //false
}}

上面的例子 == 是一个引用比较,即两个对象都指向同一个内存位置

String equals() 是对对象中值的比较进行评估。

   public class EqualsExample1{
   public static void main(String args[]){
   String s = "Hell";
   String s1 =new string( "Hello");
   String s2 =new string( "Hello");
   s1.equals(s2);    //true
    s.equals(s1) ;   //false
    }}

上面的例子它比较了字符串的内容。如果字符串匹配则返回 true,否则返回 false。

【讨论】:

    【解决方案3】:

    (1) == 可用于基元类型和对象类型,但 equals() 方法只能用于对象类型。

    (2) == 不能被覆盖以进行内容比较,但 equals 方法可以被覆盖以进行内容比较(例如;字符串类、包装类、集合类)。

    (3) == 尝试申请异构类型时出现无法比较的类型错误,其中equals方法返回false。

    【讨论】:

      【解决方案4】:
      public static void main(String[] args){
              String s1 = new String("hello");
              String s2 = new String("hello");
      
              System.out.println(s1.equals(s2));
              ////
              System.out.println(s1 == s2);
      
          System.out.println("-----------------------------");
      
              String s3 = "hello";
              String s4 = "hello";
      
              System.out.println(s3.equals(s4));
              ////
              System.out.println(s3 == s4);
          }
      

      在此代码中,您可以同时使用 '==' 和 '.equals'

      这里.equals用于比较引用对象,'=='用于比较对象的状态..

      【讨论】:

      • 你把它完全背对前了。
      【解决方案5】:

      如果两个操作数都属于同一个对象,可以说“==”运算符返回 true,但当它返回 true 因为我们不能为单个对象分配多个值时

      public static void main(String [] args){
          String s1 = "Hello";
          String s1 = "Hello";  // This is not possible to assign multiple values to single object
          if(s1 == s1){
            // Now this retruns true
         }
      }
      

      现在实际上发生这种情况时,如果没有发生,那么为什么 == 比较功能......

      【讨论】:

        【解决方案6】:

        在 Java 中,当 “==” 运算符用于比较 2 个对象时,它会检查对象是否引用内存中的同一位置。例如:

        String obj1 = new String("xyz");
        String obj2 = new String("xyz");
        if(obj1 == obj2)
           System.out.println("obj1==obj2 is TRUE");
        else
          System.out.println("obj1==obj2 is FALSE");
        

        即使字符串具有完全相同的字符(“xyz”),上面的代码实际上会输出: obj1==obj2 为假

        Java String 类实际上覆盖了 Object 类中的默认 equals() 实现——它覆盖了该方法,因此它只检查字符串的值,而不是它们在内存中的位置。这意味着如果调用 equals() 方法来比较 2 个 String 对象,那么只要实际字符序列相等,则认为两个对象相等。

        String obj1 = new String("xyz");
        String obj2 = new String("xyz");
        if(obj1.equals(obj2))
           System.out.printlln("obj1==obj2 is TRUE");
        else
          System.out.println("obj1==obj2 is FALSE");
        

        此代码将输出以下内容:

        obj1==obj2 为真

        【讨论】:

        • 它通常会检查对象是否驻留在内存中的同一位置,但这是一个实现细节。并发垃圾收集器可能会在对象的当前位置设置写陷阱,将对象复制到新位置,然后更新一个引用以引用新副本,然后最后更新另一个引用。 == 运算符必须始终返回 true,即使在两次更新之间也是如此,因为两个引用将标识同一个对象,但这并不意味着它们标识了同一个对象内存。
        【解决方案7】:

        在 Java 中,== 总是只比较两个引用(即对于非基元) - 即它测试两个操作数是否引用同一个对象。

        但是,equals 方法可以被覆盖 - 因此两个不同的对象仍然可以相等。

        例如:

        String x = "hello";
        String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
        
        System.out.println(x == y); // false
        System.out.println(x.equals(y)); // true
        

        另外,值得注意的是,任何两个相等的字符串常量(主要是字符串字面量,但也包括通过串联的字符串常量组合)最终会引用同一个字符串。例如:

        String x = "hello";
        String y = "he" + "llo";
        System.out.println(x == y); // true!
        

        这里xy 是对同一个字符串的引用,因为y 是一个等于"hello" 的编译时常量。

        【讨论】:

        • 如果不是泛型类,等于没有被覆盖。 equals 方法是否与“==”相同,只需检查类的两个实例是否引用同一个对象?谢谢。
        • @Nir:是的。在类中,除非你重写 Equals,否则它总是意味着引用相等。
        • @ingyhere: objects 不指向任何东西。 == 测试两个 references 是否指向同一个对象。如果您要抱怨“可怕的措辞”,您需要确保使用正确的术语。至于equals() 是否比较对象状态——它可以,但不是必须的,当然也不会自动进行。 (它可能会考虑一些变量是否相等,而其他变量不相等。)
        • @ingyhere:嗯,我看不出那篇文章有什么相关性。那是在谈论参数传递。被比较的值是完全引用。它们不一定是内存位置——它们是 JVM 想要用于引用的任何形式的引用。引用类型变量的值一个引用。这就是为什么在这种情况下,==引用相等运算符。请参阅 Java 语言规范的第 15.21.3 节:docs.oracle.com/javase/specs/jls/se7/html/…。这是一个定义明确的术语,我使用正确。
        • @ingyhere:在很多情况下“可以想到”,是的,但不是全部。 那就是挥手。 JVM 当然可以实现,其中引用值不是直接内存位置,而是大型查找表中的条目。不过,您的观点似乎随着时间的推移而发生了变化,指责我错误地使用了“参考”一词。您现在是否接受我对“引用”一词的使用完全符合 JLS,并且被比较的值引用?
        【解决方案8】:

        equals( ) 方法和== 运算符执行两种不同的操作。 equals( ) 方法比较 String 对象中的字符。 == 运算符比较两个对象引用以查看它们是否引用同一个实例。下面的程序展示了两个不同的 String 对象如何包含相同的字符,但对这些对象的引用将不相等:

        // equals() vs ==
        class EqualsNotEqualTo {
             public static void main(String args[]) {
                  String s1 = "Hello";
                  String s2 = new String(s1);
                  System.out.println(s1 + " equals " + s2 + " -> " +
                  s1.equals(s2));
                  System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
             }
        }
        

        变量s1引用“Hello”创建的String实例。引用的对象 s2 是用 s1 作为初始化器创建的。因此,两个 String 对象的内容是相同的, 但它们是不同的对象。这意味着s1s2 不引用相同的对象并且 因此,不是==,如前面示例的输出所示:

        Hello equals Hello -> true
        Hello == Hello -> false
        

        【讨论】:

        • 这个问题实际上并不是指字符串。虽然 equals 方法通常指的是对象的“内部”,但它没有义务这样做。许多对象的 .equals() 方法只使用内存地址(即等同于 ==)
        • 在Java中,有少量的基本类型和一个“引用”类型。 == 运算符测试其操作数是否相同。由于引用类型的“值”是一个对象的identity,所以只有当它们引用同一个对象时,操作数才被认为是相同的。对象本身无关紧要;确实,比较不用看就完成了。
        【解决方案9】:

        == 是一个运算符。 equals 是 Object 类中定义的方法

        == 检查两个对象在内存中是否具有相同的地址,对于原语,它检查它们是否具有相同的 value.equals 方法另一方面检查正在比较的两个对象是否具有相等的值(取决于当然,如何为对象实现 equals 方法。equals 方法不能应用于基元(这意味着 如果 a 是原始 a.equals(someobject) 是不允许的,但是 someobject.equals(a) 是允许的。

        【讨论】:

          【解决方案10】:

          如果你我各自走进银行,各自开一个全新的账户,每人存入 100 美元,那么……

          1. myAccount.equals(yourAccount)true 因为它们具有相同的值,但是
          2. myAccount == yourAccountfalse,因为它们不是同一个帐户

          (当然,假设 Account 类有适当的定义。;-)

          【讨论】:

          • 这将是一个非常糟糕的 equals 实现。
          • 这也是对 == 和 equals 之间区别的非常非常糟糕的解释。
          • 我喜欢这个比较,哈哈,它说明了为什么你不应该为字符串编码==,因为错误的人可能会得到你的钱,或者你可能根本没有得到你的钱。 (无论如何,谁会将钱存储为字符串 LOL)但这是吓唬程序员的一个很好的例子。
          【解决方案11】:

          == 运算符比较对象是否相同实例。 equals() 操作符比较对象的状态(例如,如果所有属性都相等)。当一个对象与另一个对象相等时,您甚至可以重写 equals() 方法来定义自己。

          【讨论】:

          • 请注意equals()Object 中的默认实现回退到有效this == other。这是一个常见的混淆来源,因为除非您使用以有意义的方式实际实现 equals() 的类,否则您不会看到差异。
          • 对,我应该提到这一点。提问者可以看一下JDK本身,有很多类可以举个例子。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-23
          • 2011-12-02
          • 2022-12-04
          • 2022-12-14
          相关资源
          最近更新 更多