为什么具有相同哈希码的对象不相等

use*_*755 0 java

我在书中发现了这句话:

如果两个对象的哈希码是等于的,那么这可能并不意味着对象是等于的.

有人可以解释一下这句话吗?

Era*_*ran 11

例如,考虑Long类的两个对象.由于hashCode返回a int,并且long(和Long)类型的范围大于int,这意味着必须有两个Long具有相同的对象,hashCode即使它们彼此不相等.


G. *_*cki 6

答案很简单:hashCode()意外地可以为两个完全不同的物体产生相同的数字.

  • 如果它是随机数,则哈希码将不起作用.默认实现是哈希码基于一些内部JDK机制,通常是对象的内存位置.**哈希码永远不会随机**. (3认同)
  • 我认为"_accidentally can produce_"是downvotes的来源.这意味着hashcode是一种产生随机值的随机魔术方法.事实上,产生冲突的决定是非常谨慎的**.决定产生哪些冲突是一项重要的性能优化. (2认同)
  • 当然,HotSpot中`hashCode`的默认实现是一个随机数.如果你覆盖它,那么它不再是一个随机值.例如,参见[this post](http://stackoverflow.com/a/26975908/1037316). (2认同)

use*_*883 5

哈希码是一个数字值,用于在基于哈希的集合中插入和标识对象。

它是一个固定的大小值,因此它对于每个现有对象都不是唯一的,因此有时会遭受碰撞。基本上,hashCode()可以为两个不同的对象产生相同的值。

例:

    String first = "wh";
    String second = "xI";
    System.out.println(first.equals(second));
    System.out.println(first.hashCode() + " " + second.hashCode());
Run Code Online (Sandbox Code Playgroud)