这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战
在看源码我们会发现在超类(Object类)中会有hashCode方法,这个方法和equals方法主要是用来比较两个对象是否相等,其中,hashCode是比较hash值的,还有hashMap(可以去看其源码)这些都和hash表有关,那么今天就引出我想分享的内容,数据结构中的hash表。
1.hash函数
说到函数大家都不陌生,hash函数也是一个映像,一个关键字对应一个地址 他这是一一映射的
2.冲突
当然,当关键字使用hash函数映射出同一个地址,这就会产生冲突(好的hash函数是尽量减少冲突的产生,但不能完全避免冲突),对于产生的冲突,也有相应的处理方法
3.冲突处理方法
常用的冲突处理方法:
-
3.1 开放地址法 例如线性探测法,其冲突处理大概的思路是若利用hash函数算出地址发生冲突,则就在算出地址上加一,若再产生冲突,则再加一直到找到不冲突的位置
-
3.2再哈希法 再hash法是在产生冲突时计算另一个哈希函数地址,直到冲突不再发生
-
3.3链地址法 这个方法也比较常用 将所有关键字为同义词(同义词是利用hash函数算出的结果一样的关键字)的记录存储在同一线性链表中。
举例:
而在hashMap中的数据结构就是采用hash表结构,而hash表结构是数组加链表(就如上面的链地址法),而在链表的长度大于8时就会转换为红黑树,如果只是用这种链表链接起来,数据过长,在查询的时候(链表查询只能一个一个查询)会很耗时,但如果只是用二叉树来代替,也会出现节点都在一侧则这样其实并没有多大的改善性能,如果用红黑树(而红黑树实际上是一种特殊的平衡二叉树,平衡二叉树当插入数据或者删除数据时他会调整数据位置,保证左右子树的平衡(可能不像AVL左右子树高度只差小于等于1,他可能会大于1)因而红黑树的查找性能是比较高的。