【Java面试题】Object类中的Hashcode和equals是有区别的
2023-02-27 09:20:53
Java基本采访题目Object中的Hashcode和equals的区别和联系是什么?在equalsObject类中,缺省实现为:returnthis==obj。也就是说,只有this和obj引用了同一个对象,返回true。该方法返回对象的散列码,返回值为int类型的散列码。
equals:
在Object类中,以returnthis==obj来实现缺省。也就是说,只有this和obj引用了同一个对象,返回true。
而且常常需要用quals来判断两个对象是否对等,而不能验证它们的唯一性。因此,当我们实现自己的类时,将覆盖equals。
根据惯例,equals符合下列规则。
相反:x.equals(x)必须为真。
null:x.equals(null)必须为假。
对称性:x.equals(y)与y.equals(x)的结果一致。
传递性:a和bequals,b和cequals,所以a和c都必须是equals。
连贯性:在某一特定运行时,2个对象的状态变化不会影响equals的决策结果,因此,在此运行时期间,不管调用equals多少次,都返回相同的结果。
哈什科德:
该方法将返回对象的散列码,并返回类型为int的散列码。
为更好地支持基于哈希机制的Java集合类,对象的散列码
比如Hashtable,HashMap,HashSet等等。
对于hashCode方法,一致的约定是:
已经覆盖euqls方法的对象必须同时覆盖hashCode()方法。
若2个对象在通过equals调用之后返回为true,则该2对象的hashCode方法必须返回相同的inthashCode代码。
当2个对象通过equals返回false时,hashCode返回的值可以相同。(但是,程序员必须知道,hashCode返回一个没有二次哈希值,这使得存储该对象的hashtables变得更好。)
上例中,Test类对象有2个字段,分别是num和data,它们表示对象的状态,它们还被用作equals方法作为判断的基础。因此,在hashCode方法中,这2个字段也要参与hash值的操作,作为hash操作的中间参数。遵循这个原则非常重要:2个对象equals,hashCode必须遵循同样的规则。
另外,涉及到equals函数的字段必须同时参与hashCode的计算。
道理:同一类中的不同对象返回不同的散列码。通常情况下,基于对象的地址转换这个对象的散列码是一种典型的方法,但这种方法并非Java所要求的唯一方法。而且往往并不是最佳方法。
与equals公认的实现约定相比,hashCode的常规需求易于理解。需要遵循两个要点,hashCode方法需要遵循。协定第三条,实际上就是第二条的精化,下面我们来看一下对于hashCode方法的一致约定需求。
首先,在某一段时间内,equals方法的决策结果只要对象的(字段)更改不会影响,那么,在此期间,hashCode调用必须返回相同的散列码,不管调用了多少次。
其次:hashCode必须是相同的,通过equals调用返回了true。
3:2个对象的散列码,通过equasl返回false并不要求不同,即它们的hashCode方法的返回值允许相同的情况。
概括一下:等效(callequals返回true)对象必须生成相同的散列码。不等效的对象,生成的散列码不一样。