[英]Why should two equal objects return equal hash codes if I don't want to use my object as a key in a hash table?
[英]Why can objects with equal hash codes be not equal
我在书中发现了这句话:
如果两个对象的哈希码相等,则可能并不意味着对象相等。
有人可以给我解释一下这句话吗?
例如,考虑Long类的两个对象。 由于hashCode
返回一个int
,并且long
(和Long
)类型的范围大于int
,这意味着必须存在两个具有相同hashCode
Long
对象,即使它们彼此不相等。
答案很简单: hashCode()
偶然会为两个完全不同的对象产生相同的数字。
哈希码是一个数字值,用于在基于哈希的集合中插入和标识对象。
它是一个固定的大小值,因此它对于每个现有对象都不是唯一的,因此有时会遭受碰撞。 基本上,hashCode()可以为两个不同的对象产生相同的值。
例:
String first = "wh";
String second = "xI";
System.out.println(first.equals(second));
System.out.println(first.hashCode() + " " + second.hashCode());
在基于哈希的实现中,无论何时您检查两个对象的相等性,它都首先检查哈希代码,如果两个对象都相同,则调用equals方法,该方法也返回true,则只有两个对象被视为相等。
2个相等的对象将具有相同的哈希码。
具有相同hascode的2个对象不必相等。
可以说hascode方法通过计数名称的字母来产生其值(这是不好的做法,但是我正在使用此示例进行解释),但是equals比较每个字符:
Paul和Mary都将返回hascode 4,但是字符不相等
即使对象的hashCode在创建时就是内存地址,由于垃圾回收器的存在,它仍必须存储在对象标头中。
垃圾收集器可以自由移动对象以完成其工作,因此当前内存地址可能随时更改。 然而:
{@code hashCode}方法必须一致地返回相同的整数,前提是未修改该对象的{@code equals}比较中使用的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.