1.Hash是什么?
hash是一个函数,该函数中的实现是一种算法,就是通过一系列的算法来得到一个hash值,这个时候,我们需要另一个东西--hash表(通过hash算法得到hash值就在这张hash表中)
2.Hash值的特征
1.一致性(consistent):在程序的一次执行过程中,对同一个对象必须一致地返还同一个整数。
2.equals结果相等,则hashcode相同(反之不一定,equals不相等,hashcode也有小概率相同)。
3.hash相同,equals不一定相同。
3.为什么hash值要组成hash表?
哈希表是一种数据结构,它可以提供快速的插入和查找操作。不管哈希表有多少数据,插入和删除时间都是接近常量的时间。即:O(n)
4.HashCode的作用
hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有
例如内存中有这样的位置
0 1 2 3 4 5 6 7
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。
但如果用hashcode那就会使效率提高很多。
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了
5.什么时候应该重写/覆盖hashcode方法?
1.只有在使用HashMap、HashSet等数据结构时,并且存储的对象是我们自定义的对象时,才需要重写。
2.当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入;如果有,就调用equals方法与新元素进行比较,相同不存,不同就存入。
6.hashcode方法默认根据什么创建的
自己创建对象hashCode是根据对象的地址计算得出的