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

时间:2014-06-27 07:56:00

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

7 个答案:

答案 0 :(得分:15)

当将实现这两​​种方法的对象添加到集合时, 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);

}

hashCode():此方法返回一个hashCode()值作为整数,并且支持基于哈希的java.util.Collection类,如Hashtable,HashMap,HashSet等。如果a class重写了equals()方法,它也必须实现hashCode()方法。在重写此方法之前,需要记住

  • 每当在执行Java程序期间多次在同一对象上调用hashCode()方法时,此方法必须始终返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不需要保持一致。
  • 如果两个对象按照equals()方法相同,则在两个对象中的每个对象中调用hashCode()方法必须返回相同的整数结果。所以,如果一个字段没有在equals()中使用,那么它不能在hashCode()方法中使用。

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

的引用

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

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

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

String str1 = new String("Name");

然后引用与两个字符串不同,这意味着它返回false

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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