Java里为什么hascode 和 equals方法 总是成对出现?

来源:互联网 发布:淘宝货源供应商可靠吗 编辑:程序博客网 时间:2024/04/27 17:29

equals如果经过重载会用来比较两个对象是否相同,就需要用到hascode

 

在set集合中,当插入一条数据的时候,会检查是否有重复的元素,这时就会调用equals方法来比较对象是否相等,如果equals方法没有被覆盖的话,比较得出两个object地址为true,其哈希码值也一定相同。
当你覆盖了equals方法,有可能得到的结果为true,但两个对象的存放的地址有可能不同,导致哈希码值不同,这样的话就可能导致hashset 不能正常运行,为了能保证hashset 能正常工作,所以需要同时覆盖hashcode 方法

 

修正一下
当要把对象存在某种Hash容器类是且不允许重复例如Hashset,应该是先调用此对象的hashcode()返回此对象的hashcode,然后判断该hashcode是否与容器类其它对象的hashcode重复,如果不重复,则表示该对象不重复("如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果"。[color=#FF6600][/color]这句话就是原因)如果有重复则调用对象的equals()方法来判断该对象是否重复.为什么这里还要调用equals()方法呢?因为下面这句话"如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能"。 [color=#FF6600][/color]
也正是因为这几句话才使得,要同时重写equals()方法和hashcode()方法.因为如果你只重写了equals()方法,有可能造成两个对象相等了而hashcode却不相等.因为此时的用于产生hashcode的hashcode()还是基于以前那个未备重写的equals()方法.