equals方法比较的是两个对象的哈希码,这么说对吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了equals方法比较的是两个对象的哈希码,这么说对吗?相关的知识,希望对你有一定的参考价值。
如题
参考技术A 没有绝对的对错,如果你重装equals方法,让他去比较两个对象的哈希码来决定两个对象是否相同的话,那这么说就是对的了。否则的话是不能这么说的。equals在原则上要和hashcode保持一致,即equals为真
两个对象hashcode应相同。
你之所以产生这个想法我想估计就这这样造成的。两个方法结果的一致性让你误以为是equals比较的是hashcode。
而在程序中真正的hashcode是和内存地址有关的,所以你可以想象每个对象的hashcode是不可能相同的,两个不一样的对象不能同时在一个内存地址上,这个肯定确保了不同对象的hashcod不同。
但是在实际运行中我们判断对象是否相同不需要那么严格,两个字符串内容一样我们就认为是相等了,而不去看他是不是在同一个内存地址上,所以这个时候我们就要重新写这个equals来达到当内容相同就返回true了,而不去管内存地址是不是一样了。。但是在很多map这类容器中判断对象是否相等则是同时比较equals和hashcode,所以为了保证这些重载过equals方法的类还能在这种情况下正常使用就规定了重载equals就一定要重载hashcode。这个也是为什么要求equals和hashcode一致性的原因。
equal和hashcode==
一:
==是运算符,用于比较两个变量是否相等;
equals是Object类的方法,用于比较两个对象是否相等;
hashCode()
是Object类的一个方法,返回一个哈希值
二:区别
基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法。
如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值。
如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的。)
有可能两个不相等的对象有相同的hashcode
总结:两个对象相等,必须有相同的hashcode 值,反之不成立
以上是关于equals方法比较的是两个对象的哈希码,这么说对吗?的主要内容,如果未能解决你的问题,请参考以下文章
如果两个对象的哈希码相同则他们不一定相同,如果对象一致则哈希码一定相同