equals()和hashCode()之间的区别

Dhi*_*kar 11 java string compare equals

我想要一个关于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());
}
Run Code Online (Sandbox Code Playgroud)

dgm*_*dgm 17

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

equals():此方法检查作为参数传递给它的某个其他对象是否等于调用此方法的对象.如果你不理解合同,很容易错误地实现equals()方法.在重写此方法之前,需要记住以下"属性" -

  • 自反:o1.equals(o1) - 这意味着一个对象(例如o1)应该等于它自己
  • 对称:o1.equals(o2)if和only 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);
Run Code Online (Sandbox Code Playgroud)

}

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方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现)


Mar*_*nov 6

hashCode()不返回对象的引用,而是以某种方式计算的对象的哈希值.==不会使用值来比较对象,hashCode()但正如您所说,通过对象引用的值来比较.

  • 以某种方式计算:以某种方式确保相同的"内容"("相等"对象)以相同的哈希码结束.对于字符串,它是内部所有字符的校验和.您可以在Javadoc for String中查看详细信息. (2认同)