2007年1月1日星期一

Java_002:何时重写hashcode()

我们知道,equals()和hashcode()都是Object类的方法,在《辨析“==”与equals》中我们知道何时重写equals(),但何时重写hashcode()呢?
要想知道何时重写hashcode(),就必须了解hashcode是个啥东东。
其实,hashcode跟集合有很大关系,Java中的集合(Collection)分为两大类:List和Set,前者有序且元素可以重复,后者无序且元素不可重复。

问题来了,如何判断两个元素是否是相等的呢?

判断规则如下:

首先判断两个对象的hashcode()是否相等 如果不相等,则认为两个对象也不相等。
如果相等,再判断equals()是否相等,如果相等,则认为两个对象相等,否则不相等。


为何不直接使用equals()判断是否相等?——因为equlas()相对hashcode()较费时,如果集合中已经有1000个元素,那么加入第1001个元素时,就要调用1000次equals()方法。
这是无法让人接受的。而hashcode()算法要快很多,这当然要感谢哈希这个人,一个高效的hash算法是很重要的。
同时,上面这个判断规则隐含了两个重要命题:
(1)equals()相等的两个对象,hashcode()一定相等。(2)equals()不相等的两个对象,hashcode()有可能相等。
这下我们就明白了,当向Set集合中插入新对象时,先调用这个对象的hashcode()方法,就可以直接放到对应的“格子”中。如果这个“格子”中已经有对象了,就调用新对象的equals()与原有对象进行比较,如果相等,就不保存了;如果不等,就需要重新计算hashcode(),保存到另一个“格子”中。

参考文献:
1.
http://dev.firnow.com/course/3_program/java/javajs/20090924/177002.html

没有评论: