本帖最后由 强子 于 2011-11-24 08:40 编辑
我笔记中记的:
用哈希算法来提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法,即使可能暂时不会用到当前类的hashCode方法,但是为它提供一个hashCode方法也不会有什么不好,没准以后什么时候有用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同事覆盖。
通常来说,一个类的两个实例对象用equals()方法来比较的结果相等时,他们的哈希码也必须相等,但反之则不成立,即equals方法比较结果不想等的对象可以有相同的哈希码。或者说哈希码相同的两个对象的equals方法比较的结果可以不等,例如,字符串“BB”和“Aa”的equals方法比较结果可定不想等,但它们的hasCode方法返回值却相等。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这回导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。 |