Java里为什么hascode 和 equals方法 总是成对出现?
2010-09-26 17:02
239 查看
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()方法.
在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()方法.
相关文章推荐
- 转 Java中equals()和hasCode()的方法详解_NightMare(转载)
- hascode和equals为什么要同时复写—Java源码中的奥秘
- 2017-08-28-java-为什么要同时重写hasCode和equals
- Java中equals()和hasCode()的方法详解
- java中的hasCode与equals理解(转载) .
- 重写equals和hasCode 方法 JDK1.7
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- java中== equals hascode解析
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- 只要覆盖equals()方法,就应该覆盖hasCode()方法
- Java 中hashCode & Equals方法
- 《问题总结》JAVA什么时候要覆盖toString()、equals()、hashCode()方法??为什么要覆盖呢? 《通俗回答》
- 【Java实战】源码解析为什么覆盖equals方法时总要覆盖hashCode方法
- Java为什么要重写hashCode()和equals方法
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- java为什么要重写hashCode和equals方法
- Java中 ==,equals以及hascode的区别