我的认识:
如果将计算机看作是一个异国人,java中使用哈希算法的对象看做一种异国语言,equals()和hasncode()就像是两个翻译,equals()是翻译成我们的语言,hashcode()是翻译成计算机中使用哈希算法的对象的语言。在我们和计算机交互时,要想认为两个事物相同,必须让我们和计算机都认为这两个事物相同,所以两者都要使用。
其实真正的原因是出于对程序完整性的考虑,重写了对象的equals()方法后有必要重写该对象的hashCode()方法。原因是重写equals()fangfahou 可以调用他来进行对象间的比较,可以达到目的。但是如需将对象存入类似HashSet这类对象中时,问题就出现了(没有重写hashCode())Set集合石不允许有重复值的,而判断时都重复是通过比较他们的hashCode值,通过重写equals()比较对象结果相等,但用hashCode()值比较不相等,所以为了结果的一致性,需要重写hashCode()。
只有类的实例对象要被采用哈希算法进行储存盒检索时,这个类才需要按要求覆盖hashCode()方法,其实程序可能暂时不会用到当前类的hashCode方法,但是为他提供一个hashCode方法也没有什么不好,没准以后什么时候就用到了这个方法,所以要求hashCode方法和equals方法一并被覆盖。
hashCode()的返回值使用来分类对象在一些特定的收集对象中的位置,可以理解成是根据内存地址算出来的,这些收集对象包括:HashMap,HashSet,Hashtable等
重写equals()需要先查对象是否为null,对应异常NullPointException,然后在判断两个对象是否为同一类型,对应异常:ClassCastException。
通常来说,一个雷的两个实例对象用equals方法比较的结果相等时,他们的哈希值也必须相等,反之则不成立。即equals方法比较的结果不相等的对象,可以拥有相同的哈希码,或者说哈希吗相同的两个对象的equals方法的比较结果可以不等。但是,为不相等的两个对象生成不同整数结果可以提高哈希表的性能。
当一个对象被存储进HashSet集合后,就不能修改对象中的那些参与计算哈希值的字段,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,其实contains方法使用该对象的当前引用作为参数取HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
如果你想将对象A放入另一个手机对象B中,或者使用对象A查找一个元对象在收集对象B里位置的钥匙,并且支持是否容纳,删除手机对象B中的元素这些操作,那么equals()和hashCode()必须开发者自己定义。
|