equals() 和 hashCode() 的区别

新手上路,请多包涵

我想要一个关于 equals() 、“==” 和 hashCode() 的简要定义。如果我运行以下代码意味着输出将是“true false 2420395 2420395”。但我知道 equals() 方法比较字符串,而“==”比较引用。但是在输出中,hashCcode() 方法将两个字符串的引用号打印为相同,然后为什么“==”返回“false”。

     String str = "Name";
    String str1 = new String("Name");

    if (str.equals(str1))
        System.out.println("true");
    else
        System.out.println("false");

    if (str == str1)
        System.out.println("true");
    else
        System.out.println("false");

    System.out.println(str.hashCode());
    System.out.println(str1.hashCode());

原文由 Dhivakar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 465
1 个回答

当将实现这两种方法的对象添加到集合中时, equals()hashCode() 方法被证明是非常重要的。如果实施不当,可能会毁了你的生活。

equals() :此方法检查作为参数传递给它的其他对象是否等于调用此方法的对象。如果不理解契约,很容易错误地实现 equals() 方法。在覆盖此方法之前,需要牢记以下“属性”-

  • 自反:o1.equals(o1) - 这意味着一个对象(例如 o1)应该等于它自己
  • 对称:o1.equals(o2) 当且仅当 o2.equals(o1)
  • 传递:o1.equals(o2) && o2.equals(o3) 意味着 o1.equals(o3) 也是
  • 一致:只要 o1 和 o2 未修改,o1.equals(o2) 返回相同
  • null 比较:!o1.equals(null) - 这意味着任何可实例化对象都不等于 null。因此,如果您将 null 作为参数传递给对象 o1,那么它应该返回 false。
  • 哈希码值:o1.equals(o2) 意味着 o1.hashCode() == o2.hashCode() 。这个非常重要。如果定义 equals() 方法,则还必须定义 hashCode() 方法。这也意味着,如果你有两个相等的对象,那么它们必须有相同的 hashCode,但反之则不然

来自java源代码

*
* @param   obj   the reference object with which to compare.
* @return  {@code true} if this object is the same as the obj
*          argument; {@code false} otherwise.
* @see     #hashCode()
* @see     java.util.HashMap
*/
public boolean equals(Object obj) {
   return (this == obj);

}

hashCode() :此方法返回一个 hashCode() 值作为 Integer 并支持基于哈希的 java.util.Collection 类(如 Hashtable、HashMap、HashSet 等)的好处。如果一个类覆盖 equals() 方法,它必须也实现 hashCode() 方法。在覆盖此方法之前,您需要牢记

  • 每当在 Java 程序执行期间对同一对象多次调用 hashCode() 方法时,此方法必须一致地返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不需要保持一致。

  • 如果根据 equals() 方法两个对象相等,则在这两个对象中的每一个中调用 hashCode() 方法都必须返回相同的整数结果。所以,如果一个字段没有在 equals() 中使用,那么它就不能在 hashCode() 方法中使用。

  • 如果根据 equals() 方法两个对象不相等,则两个对象中的每一个都可以返回两个不同的整数结果或相同的整数结果(即,如果 2 个对象具有相同的 hashCode() 结果并不意味着它们相等,但是如果两个对象相等,则它们必须返回相同的 hashCode() 结果)。

根据 java 源代码 尽可能多的合理实用,由 java.lang.Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现的)

原文由 dgm 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题