Java equals()和hashCode()之间的差异

Java equals()和hashCode()之间的差异,java,string,compare,equals,Java,String,Compare,Equals,我想要一个关于equals(),“==”和hashCode()的简短定义。如果我运行以下代码,则表示输出为“true false 2420395 2420395”。但是我知道equals()方法比较字符串,“==”比较引用。但是在输出中,hashCcode()方法将两个字符串的引用号打印为相同的,那么为什么“==”返回“false” hashCode()不返回对象的引用,而是以某种方式计算的对象的哈希值=不使用hashCode()的值来比较对象,但是,正如您正确地说的,通过对象引用的值来比较对象

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

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

您可以阅读。简单地说,如果
(obj1.equals(obj2)
真的,那么
obj1.hashCode()==obj2.hasCode()
必须是真的,才能成为有效的实现

请注意,这并不意味着两个不同的对象不能共享相同的哈希代码。实际上,此示例是该方法的一个有效(但糟糕)实现:

class MyClass {
    public int hashCode() {return 0;}
}
.equals()
比较字符串的实际内容

“==”运算符比较两个对象是否是内存中的相同引用。如果要执行
str=str1;
,则双等于运算符将返回
true
,因为它们指向内存中的相同引用

hashCode()
以任意方式返回对象的哈希值。只要该方法未被某种方式重写,则返回的值将始终是唯一的。如果
.equals()
返回true,则哈希代码应相同

  • 正如其他人所说,'=='比较引用。但这两个方法只是做一些可以重写的事情的方法
  • 每个方法都有作用。如果你想知道它到底是做什么的,它的意义是什么,你需要阅读文档
  • 您可以以任何方式重写这些方法。但请注意,您必须遵循这两个方法的JAVA文档。因为它们被其他类使用。例如,当您尝试在列表中查找对象和
    .hashCode()时,会使用
    equals()
    用于JAVA类库提供的一些哈希表类
  • 当实现这两个方法的对象被添加到集合中时,equals()和hashCode()方法被证明是非常重要的。如果实现不正确,可能会毁了你的生活

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

    • 自反式:o1。等于(o1)-这意味着一个对象(例如o1)应该等于它自己
    • 对称:o1.equals(o2)当且仅当o2.equals(o1)
    • 及物:o1.equals(o2)&&o2.equals(o3)也意味着o1.equals(o3)
    • 一致性:o1。只要o1和o2未被修改,equals(o2)返回相同的值
    • null比较:!o1.equals(null)-这意味着任何可实例化对象都不等于null。因此,如果将null作为参数传递给对象o1,则它应返回false
    • 哈希代码值:o1.equals(o2)表示o1.hashCode()==o2.hashCode()。这非常重要。如果定义equals()方法,则还必须定义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()值,基于哈希的java.util.Collection类(如Hashtable、HashMap、HashSet等)支持此方法。如果类重写equals()方法,则必须实现hashCode()方法。在重写此方法之前,您需要记住

    • 在Java程序的执行过程中,每当对同一对象多次调用hashCode()方法时,此方法必须一致地返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不必保持一致
    • 如果两个对象按照equals()方法相等,那么在两个对象中调用hashCode()方法必须返回相同的整数结果。因此,如果equals()中未使用字段,则hashCode()方法中不得使用该字段

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

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

    equals()仅比较字符串,它不会检查字符串的引用

    但是“==”同时检查引用和数据

    在第一种情况下,String str=“Name”只创建一个对象,但在

    第二种情况是创建两个对象

    String str1 = new String("Name");
    
    然后,两个字符串的引用不相同,这意味着它返回false

    equals()和hashCode()是不同的方法,不应使用hashCode方法检查两个对象引用是否相同。 原因:hashCode只返回一个对象的int值,即使两个不同的对象也可以具有相同的hashCode整数。hashCode()返回的值是对象的哈希代码,它是对象的十六进制内存地址。 相等
    String str1 = new String("Name");