java hashcode相同,equals一定为真?equals为真,hashcode不一定为真?
发布网友
发布时间:2022-09-05 08:43
我来回答
共2个回答
热心网友
时间:2024-11-30 01:44
hashcode()和equals(object
o)方法是java所有类的基类object类中的方法,所有类都继承了object类以及其中的方法。equals与hashcode的定义必须一致,即:如果x.equals(y)返回true,那么x.hashcode()就必须与y.hashcode()具有相同的值。当然,对于两个不同的对象,x.hashcode()与y.hashcode()基本不会相同(不排除极少数情况会相同)。
在基类object类中,默认的equals方法是判断两个对象是否具有相同的引用,如果具有相同的引用,那它们必然是相等的。不过这种判断方法并不是一直都通用,比如:有的时候,两辆汽车,只要型号配置相同,就可以认为是相等的,出厂日期可以忽略不计。这种时候就需要在你的类中重写equals方法,对于这个类用你自己的方法来判断两个对象是否相等(重写equals方法就必须重新定义hashcode()方法)。
注:如果对两个对象进行==操作,那么就会自动调用object类默认的equals方法来进行比较。希望能帮到你~
热心网友
时间:2024-11-30 01:44
两者之间唯一的必然关系被你说反了,equls返回为true,则两者的hashcode一定相等,意即相等的对象必须具有相等的哈希码。每当equals方法被覆写,通常需要重写hashCode方法从而
保持对象行为的一致性。而具有相等的hashcode的两个对象equals不一定成立。你可以这样认为也行,hashcode是作为一个对象存储的参考,hash表本身是一种散列表,在数据存储这块,功效比较大,而equals是相当于两对象之间的属性(成员变量)“相等”,意即具有相同的行为(方法)。或许这样讲起来理解比较的费劲。举个例子,比如你定义class
A有两个属性,int
aA,aB,在定义一个class
B也有两个属性,int
bA,bB,然后覆写hashcode方法,A类为return
aA*aB;B类为return
bA*bB.现在情况已经很显然了,各自实例化一个对象:a,b,假如:a.aA=b.bA,a.aB=b.bB,相等,或者a.aA=b.bB,a.aB=b.bA两个对象a,b的hashcode一定相等,当时你能说两个对象相等吗?显然不能吧,a与b都是不同类的实例。连equals最基本的obj
instance
of
A或是obj
instance
of
B都不成立。如果是同一个类的不同对象,当两者拥有相同hashcode的时候,则一定相等,或者equals成立的时候则hashcode一定为真,这也就是所谓的相等的对象具有行为一致性。