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()); } 

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

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); 

}

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

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

您可以阅读hashCode文档 。 简而言之,它表示if (obj1.equals(obj2)true,obj1.hashCode()==obj2.hasCode()必须为true才能成为有效的实现

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

 class MyClass { public int hashCode() {return 0;} } 

.equals()比较字符串的实际内容。

“==”运算符比较两个对象在内存中是否是相同的引用。 如果你要做str = str1; ,那么double-equals运算符将返回true因为它们指向内存中的相同引用。

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

equals()只比较字符串它不检查字符串的引用

但’==’检查参考和数据

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

第二种情况创建两个对象

 String str1 = new String("Name"); 

那么引用与两个字符串都不相同,这意味着它返回false

  1. 正如其他人所说’==’比较参考文献。 但是这两种方法只是做一些可以被覆盖的方法。
  2. 每种方法都有所作为。 如果您想知道它究竟是什么以及它的含义是什么,您需要阅读文档。
  3. 您可以以任何方式覆盖这些方法。 但请注意,您必须遵循这两种方法的JAVA文档。 因为它们被其他类使用。 例如,当您尝试在列表中查找对象时使用.hashCode()并且在JAVA类库提供的某些哈希表类中使用.hashCode()

equals()和hashCode()是不同的方法,不应使用hashCode方法来检查两个对象引用是否相同。 原因: hashCode只返回Object的int值,即使两个不同的对象也可以具有相同的hashCode整数。 hashCode()返回的值是对象的哈希码,它是hex的对象的内存地址。 equals()检查两个对象引用是否相同。 如果两个对象相等,则它们的hashCode必须相同,但反之则不然。