Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么hashCode()和equals()都存在_Java - Fatal编程技术网

Java 为什么hashCode()和equals()都存在

Java 为什么hashCode()和equals()都存在,java,Java,为什么java对象类有两个方法hashcode()和equals()?其中一个看起来是多余的,它被过滤到最底层的派生类?等于比较对象,哈希代码用于从对象生成哈希值,然后由java映射容器(哈希表、映射等)使用 通常会一起重写它们(如果重写hashcode,则需要重写equals,反之亦然)。首先,重写equals()时,还必须重写hashcode() 不这样做 将导致违反Object.hashCode的通用合同,这将 阻止类与所有基于哈希的 集合,包括HashMap、HashSet和Hashta

为什么java对象类有两个方法hashcode()和equals()?其中一个看起来是多余的,它被过滤到最底层的派生类?

等于比较对象,哈希代码用于从对象生成哈希值,然后由java映射容器(哈希表、映射等)使用


通常会一起重写它们(如果重写hashcode,则需要重写equals,反之亦然)。

首先,重写equals()时,还必须重写hashcode()

不这样做 将导致违反Object.hashCode的通用合同,这将 阻止类与所有基于哈希的 集合,包括HashMap、HashSet和Hashtable

这是从对象规范[JavaSE6]复制的合同:

  • 在执行过程中多次在同一对象上调用- 对于应用程序,hashCode方法必须一致地返回 相同的整数,但未提供在 对象被修改。此整数不需要从一个execu保持一致- 将一个应用程序转换为同一应用程序的另一个执行
  • 如果根据equals(Object)方法,两个对象相等,则调用- 对两个对象中的每个对象使用hashCode方法必须产生相同的结果 整数结果
  • 根据equals(Object)方法,如果两个对象不相等,则不需要对这两个对象中的每一个调用hashCode方法 必须生成不同的整数结果。然而,程序员应该是 请注意,为不相等的对象生成不同的整数结果可能会提高 哈希表的性能

    • 为什么你认为一个是多余的?他们说了不同的话:

      • hashCode
        是“给我一些有效的方法,看看两个对象是否可能相等”
      • equals
        是“检查此对象是否真正等于另一个对象”
      你绝对需要两者


      为了高效地查找哈希表,您绝对需要哈希代码,而且您绝对需要进一步的相等性检查,因为哈希会发生冲突(例如,可能的字符串远多于哈希代码)。

      基本思想是通过比较
      hashcode()
      s快速检查两个对象是否可能相等。如果它们的哈希代码相等,那么对象可能相等(不一定,但这是一个很好的猜测)。然后使用
      equals()
      执行更深入(更昂贵)的检查。这对于加快所有类型的查找(从地图等)非常重要。

      @Neeraj:hashCode可能会发生冲突,即具有相同hashCode的对象并不总是相同的。这是不适用的。两个完全不同的对象可以具有相同的哈希代码。想象一下,hashcode的最大值为
      Integer.max_value
      ,而从理论上讲,您可以创建无限多的不同对象。您至少可以尝试阅读API--Javadoc for Object.hashcode()显式地说:“支持此方法是因为有了java.util.Hashtable提供的哈希表。”“我不认为它们真的应该在Object中。”你是说它们都在Object中,还是仅仅是hashCode()?equals()作为检查标识的最终方法(可能命名不同以避免混淆)在我看来是正确的。equals()但是,作为检查相等性的虚拟方法,它似乎位于错误的位置。@Martinho:两者都有。引用标识可以用==进行检查……但是大多数类型实际上没有“相等”的概念或者基于数据的合理散列-那么为什么要为所有对象发布它们呢?当然,这篇博文有更多的细节:)另外,因为hashCode是一个int,所以它可以通过充当随机访问的索引来加快查找速度。。