hash算法以及解决冲突的方法

来源:互联网 发布:mac版的rar 解压软件 编辑:程序博客网 时间:2024/05/22 08:25

哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。

int hash = hash(key.hashCode());int i = indexFor(hash, table.length);  

hash表的优缺点
优点:我们知道数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。而hash表综合两者的特性,是一种寻址容易,插入删除也容易的数据结构。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级,效率极高。
缺点:
1.哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。
2.没办法顺序遍历hash表。

hash表的适用范围
快速查找,删除的基本数据结构,通常需要总数据量可以放入内存,在海量数据处理中有着广泛的应用。

解决hash冲突的方法:
开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。没有空的位置就会进行扩容。

链地址法:
将所有关键字为同义词的记录存储在一个单链表中,一旦发生冲突,在当前位置给单链表增加结点就行。
缺点:查找时需要遍历单链表的性能损耗。

hashMap的优缺点:
遍历速度 插入删除速度 随机访问速度 备注

List 快 慢 快 必须之前知道数组元素个数,因为申请内存是连续长度明确的
Set 快 快 慢 比list多占一个指针的存储空间
HashMap 慢 快 快 适合海量数据,o(1)的随机访问速度,不是可遍历。线程不安全,安全的concurrentHashMap.