Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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是相同的,为什么不意味着o1.等于(o2)?_Java_Equals_Hashcode - Fatal编程技术网

Java 如果两个对象hashcode是相同的,为什么不意味着o1.等于(o2)?

Java 如果两个对象hashcode是相同的,为什么不意味着o1.等于(o2)?,java,equals,hashcode,Java,Equals,Hashcode,equals()和hashCode()的实现应该遵循这些规则 如果o1.equals(o2),则o1.hashCode()==o2.hashCode()应始终为真 如果o1.hashCode()==o2.hashCode()为真,并不意味着o1.equals(o2)为真 如果o1.hashCode()==o2.hashCode()为真。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希代码。如果两个对象的哈希代码相同,为什么不意味着o1.equals(o2)?考虑Long。此类型有2^6

equals()
hashCode()
的实现应该遵循这些规则

  • 如果
    o1.equals(o2)
    ,则
    o1.hashCode()==o2.hashCode()
    应始终为真
  • 如果
    o1.hashCode()==o2.hashCode()
    为真,并不意味着
    o1.equals(o2)
    为真

  • 如果
    o1.hashCode()==o2.hashCode()
    为真。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希代码。如果两个对象的哈希代码相同,为什么不意味着
    o1.equals(o2)

    考虑
    Long
    。此类型有2^64个可能的值
    hashCode
    返回一个
    int
    ,它只有2^32个可能的值


    对于标识哈希代码(可从
    System.identityHashCode
    获得),对象在许多现代JVM实现的内存中移动。没有合理的方法来跟踪哪些哈希代码仍在使用。即使使用(线程安全)计数器,分配2^32次后,也需要某种形式的重用。

    哈希函数(线索在名称中)的目的是返回在不同对象的范围内均匀分布的值。不为每个对象返回不同的值

    这意味着哈希函数通常有冲突。尽管理想情况下,它们的数量应该尽可能小。

    想象一个如下的哈希算法(不一定是好的)

  • 取最后4位数字作为我们分配的ID

  • 想象两个ID分别为12341234和67281234

  • 哈希代码是相同的,但id和它们标识的可能不同

    有点像:

    如果约翰和詹姆斯是双胞胎,那么他们一定属于同一位母亲

    (我相信你同意)这不是什么意思

    如果约翰和詹姆斯属于同一个母亲,那么他们一定是双胞胎

    其中“拥有相同的母亲”是指拥有相同的哈希代码,“双胞胎”是指平等


    对于其余的问题,我建议你通读这个问题的第一个答案

    ,因为所有叫“Rezo”的人都不是你。正确的说法是“不是所有叫“Rezo”的人都是你”。我们有经验证据表明,至少其中一个是哈希代码不是唯一的?如果o1和o2对象的哈希代码相等,这意味着什么?两个对象可以有相同的哈希代码吗?实际上所有对象都可以有相同的哈希代码,这将是一个合法的哈希函数。但不太实用。@Andres有一个选项可以构建HotSpot,使每个标识哈希代码都是1-用于调试目的。