Object类相关
equals()和hascode()区别?(字节1)
两个方法都能用来对比两个对象是否相等。区别在于:性能和可靠性;
(1)性能上: equals对比的效率会比较低。
(2)可靠性上:
1. equals()对比是绝对可靠的,equals()相等的两个对象他们的hashCode()肯定相等。
2. hashCode()不是绝对可靠的(不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题)),hashCode()相等的两个对象他们的equal()不一定相等。
所以如果需要大量并且快速对比,可以先用效率比较高的hashCode进行对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较,如果hashCode相等,再用equals对比,euqals相同则表示这两个对象确实相同,既提高了性能也保证了可靠性。
为什么实现equals一定要重写hashCode,不重写会出现什么问题?(字节1)
《Effective Java》中的解释道:
在每个重写equals方法的类中,必须重写hashCode方法。如果不这么做的话,就会违反Object.hashCode方法的通用规定,从而导致该类无法结合所有基于散列的集合一起正常工作,好比HashMap、HashSet和Hashtable。
源码中的对hashCode使用规定的内容如下:
下面是hashCode通用规定的内容:
(1)在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
(2)如果两个对象根据equals(Object)方法比较是相等的,那么在两个对象上分别调用hashCode()必须产生相同的整数结果。
(3)没有要求说如果两个对象根据equal()方法比较是不相等的,那么在两个对象上分别调用hashCode()产生的整数结果一定不相等。但是,程序员应该意识到,为不相等的对象产生不同的整数结果可以提高散列表的性能。
如果没有重写hashCode()那么违反的约定是第二条:相等的对象必须具备相等的散列码(hash code)。根据Object类的equals方法,两个截然不同的实例在逻辑上可能是相等的,但是,根据Object类的hashCode方法,它们仅仅是两个没有任何共同之处的对象。因此,对象的hashCode方法返回两个看起来是随机的整数,而不是根据第二个约定所要求的那样,返回两个相等的整数。
源码注释相关内容:

浙公网安备 33010602011771号