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

时间:2015-12-10 08:47:44

标签: java

我在书中找到了这句话:

  

如果两个对象的哈希码相等,则可能并不意味着该对象   等于。

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

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

答案很简单:hashCode()意外地可以为两个完全不同的对象生成相同的数字。

答案 2 :(得分:4)

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

它是一个固定大小的值,因此它对于每个现有对象都不是唯一的,因此它会不时地发生冲突。基本上,hashCode()可以为两个不同的对象生成相同的值。

示例:

    String first = "wh";
    String second = "xI";
    System.out.println(first.equals(second));
    System.out.println(first.hashCode() + " " + second.hashCode());

答案 3 :(得分:1)

在哈希基本实现中,当你检查两个对象是否相等时,它首先检查第一个哈希码,如果它对两个对象都相同,那么它调用equals方法,它也返回true然后只考虑两个对象相等。

答案 4 :(得分:0)

2个相等的对象将具有相同的哈希码。

具有相同hascode的2个对象不必相等。

让我们说hascode方法通过对名字的字母(不好的做法,但是我用这个例子来解释它)产生它的价值,但是equals比较每个字符:

Paul和Mary都会返回hascode 4,但字符不相等

答案 5 :(得分:0)

即使对象的hashCode在创建时是内存地址,由于垃圾收集器,它仍然必须存储在对象头内。

垃圾收集器可以自由移动对象来完成其工作,因此当前内存地址可能随时更改。但是:

  

{@code hashCode}方法   必须始终返回相同的整数,前提是没有信息   用于{@code equals}对象的比较被修改。