1、作用原理
引用http://blog.csdn.net/seu_calvin/article/details/52094115
Java中的集合有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 equals方法可用于保证元素不重复,但如果每增加一个元素就检查一次,若集合中现在已经有1000个元素,那么第1001个元素加入集合时,就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。这样一来,当集合要添加新的元素时,先调用这个元素的HashCode方法,就一下子能定位到它应该放置的物理位置上。
(1)如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
(2)如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了;
(3)不相同的话,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
如何理解HashCode的作用:
从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,下次做Object的比较或者取这个对象的时候(读取过程),它会根据对象的HashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。若HashCode相同再去调用equal。
2、结论
对象 | hashcode |
相同 | 一定相同 |
不同 | 可能相同 |
为什么对象不同 hashcode 可能相同呢?假设覆盖的hashcode算法如下:
private int i;
public int hashcode(){
return i % 10;
}
在i是10的整数倍的时候结果都是相同的,但是对象不同。
3、引申意义
我们在类中覆盖equals方法,也必须覆盖hashcode方法
例如我们规定person对象只要姓名、年龄、性别相同则对象相同 。hashcode覆盖方法如下:
@Override
public int hashCode() {
int result =name.hashCode();
result =17*result + gender.hashCode();
result =17*result + age;
return result;
}
equals方法见我的另一篇文章https://mp.csdn.net/editor/html/114582738