【问题标题】:How and what does "==" operator in java check?java中的“==”运算符如何检查以及检查什么?
【发布时间】:2012-07-27 12:55:31
【问题描述】:

我已经坚持了一段时间了,实际上我有 2 个对象,根据我的说法是相同的,我已经覆盖了 hashCode 方法来为两者创建相等的哈希码,仍然当我使用“=”比较它们是否相等时=" 或对象的等号(也使用 "=="),它返回 false 给我,下面的场景应该完全解释:::

1)HashCode-->-626561382 AND 2)HashCode--->-626561382  
1)IdentityHashCode-->19640463
2)IdentityHashCode-->22330755  
1)Bean1=beans.OrdersBean@daa76e9a  AND 2)Bean2=beans.OrdersBean@daa76e9a  
Check MySelf for(==)-->false  
Check Object's Equals()-->false

请解释一下为什么会这样????

【问题讨论】:

  • 但是,每当创建一个新对象时,都会调用 hashCode() 方法,并且由于我已经覆盖了 hashCode() 方法,所以我的 hashCode 应该运行(正是这种情况正在发生)并且作为我们知道 hashCode() 实际上表示对象将在堆上的创建方式和位置,这意味着当 2 个对象的 hashCode 相同时,它们应该指向堆上的同一个实例(第一个),因此,当“==”比较内存引用时,这应该返回true..如果错了请纠正我..!!
  • 你错了。哈希码与 == 运算符无关。 == 正在检查引用相等性,hashCode() 方法正在检查实例的 hashCode(但是您已经决定应该计算它),您的哈希码相同的事实仅意味着无论您的 hashCode 方法正在计算两个对象的 hasCode 相同,如果对象的 equals 方法返回 true,则应该这样做。在程序员确定两个对象值相等的任何情况下,equals 方法都应该返回 true。
  • @JonTaylor 根据 JLS7,对于 hashCode; “这通常是通过将对象的内部地址转换为整数来实现的……”;因此,如果 2 个对象的 hashCodes 相等,这意味着它们在内存中的内部地址相等,并且“==”只比较那个,也就是说,如果对象在内存中具有相同的地址,:: 如果错误,请纠正我.. !!
  • 您可能在内置实现方面是正确的,尽管我不认为这应该被依赖,因为它可以被覆盖并且正如您在之前的评论中所说的“并且我已经结束了-ridden hashCode() 方法”你确实覆盖了 hascode 方法,所以它不再有它的默认行为。

标签: java hash operators equals hashcode


【解决方案1】:

==运算符比较java中对象的引用(内存位置)...

如果你比较对象然后使用.equals()

if(obj1.equals(obj2)){

}

【讨论】:

    【解决方案2】:

    要比较两个对象的相等值,您需要重写 equals 方法。

    其他人提到的== 运算符比较引用(即它是完全相同的对象)

    说明

    如果您以同卵双胞胎 Ben 和 Adam 为例,在比较两者时使用 == 会返回 false,因为 Ben 不是 Adam(即使它们看起来相同),如果您使用 .equals 和比较是基于外观的,那么这将返回 true。

    【讨论】:

      【解决方案3】:

      在 Java 中,== 用于比较引用。要评估两个对象是否等效,请使用equals

      注意如果您必须比较自定义对象,请考虑根据您的等效标准在您的类中覆盖 equals

      【讨论】:

        【解决方案4】:

        从父 Object 的方法中覆盖 .equals,这是为了“更深入”的比较,而 == 涉及检查引用(标识符)是否引用(以便对一个的更新适用于两者) 相同的实例化。

        【讨论】:

          【解决方案5】:

          1.使用 '==' :

          当你想检查两个引用变量是否引用同一个对象时,你应该在 java 中使用 == 运算符。例如 - (假设有一个名为 Person 的类)

          Person person1 = new Person();
          Person person2 = person1;
          
          System.out.println(person1 == person2); // true
          

          这里我们只使用了一次new,只有一个对象在堆内存中被创建,我们将它分配给一个引用变量-> person1。在第二个语句中,我们将 person1 分配给 person2。所以实际上内存中只有一个对象,但 person1 和 person2 都指向同一个对象。

          [简而言之,我们可以说,类似于原语,== 比较变量中的值,在引用变量的情况下是实际对象的内存地址]。

          2。使用 '.equals()' :

          当您想检查两个对象是否有意义地相等时,请使用 .equals() 方法。例如 -

          Person person1 = new Person();
          Person person2 = new Person();
          
          System.out.println(person1.equals(person2)); // false
          

          在这里,我们完全创建了两个不同的对象,因此它们在意义上并不相等。因此 equals() 方法将返回 false。

          【讨论】:

            猜你喜欢
            • 2013-02-13
            • 1970-01-01
            • 2011-11-28
            • 2016-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-16
            • 2022-06-17
            相关资源
            最近更新 更多