为什么要重写hashCode()(转载)

首先说建议的情况:  比如你的对象想放到Set集合或者是想作为Map的key时(非散列的Set和Map,例如TreeSet,TreeMap等),那么你必须重写 equals()方法,这样才能保证唯一性。

当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该 在重写equals()方法的同时,也重写hashCode()方法。

然后再说说必须重写hashCode()的情况:
如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。

在java中,equals和hashcode是有设计要求的,equals相等,则hashcode一定相等,反之则不然。

为何会有这样的要求?

在集合中,比如HashSet中,要求放入的对象不能重复,怎么判定呢?

首先会调用hashcode,如果hashcode相等,则继续调用equals,也相等,则认为重复。

如果重写equals后,如果不重写hashcode,则hashcode就是继承自Object的,返回内存编码,这时候可能出现equals相等,而hashcode不等,你的对象使用集合时,就会得不到正确的结果
---------------------------------------------------------------

1、当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到一个位置来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。

2、当重写equals方法时,必须要重写hashCode方法。

在java的集合中,判断两个对象是否相等的规则是:

1),判断两个对象的hashCode是否相等

      如果不相等,认为两个对象也不相等,完毕 ; 如果相等,转入2

2),判断两个对象用equals运算是否相等

      如果不相等,认为两个对象也不相等

      如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)

    可见hashcode()相等时,equals()方法也可能不等。

posted on 2014-12-12 11:11  hi_rain  阅读(343)  评论(0)    收藏  举报