哈希表冲突

哈希表是啥子?

1、哈希表其实也叫散列表,两个是一个玩意,英文是Hash Table

2、哈希表是一个数据结构

在这里插入图片描述

 哈希冲突

当有两个不同key值经过哈希函数计算后,得到同一个下标,那么它们就存在在同一个桶里,那么就会产生哈希冲突。实际中冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。

解决哈希冲突的方法

1.开放寻址法

 简单来说,就是当你的位置被占了之后,你就只能再另换位置,那就可以看下一位(下一个桶)是否被占,如果没有就存在这个桶中,如果被占,那就再查找下一个位置,以此类推,直到找到空位置为止。

但这个有个问题,当你一直找不到空位置(但是实际情况是位置不会被占光的,因为有一定量的位置被占了的时候就会发生扩容),该怎么办呢?

这个时候就需要用到扩容了,而且这个扩容也不是简单的把数组扩大,而是新创建一个数组是原来的2倍,然后把原数组的所有Entry都重新Hash一遍放到新的数组。

重新Hash? 也就是当你扩容之后,哈希函数就会发生变化,这里的hash就会通过新的哈希函数来计算出新的位置来存放。

2.拉链法(HashMap的冲突处理方式

 简单来说,就是当你位置被占之后,不会再找其他位置进行插入,而是我就要放在这个 位置,这个时候就会生成一个链表,这个时候这个位置不单单只是entry了还有next指针,这个指针指向另外一个位置,(指向的是这个位置的内存地址)。如果还有冲突,那么就继续把那个新的entry放在新的位置上,将这个李四的next指向它。这样就形成一个链表。

但是这里有一个问题,当我们这个链表存入的entry过多,也就是冲突太多,链表就会变得很长,就会导致性能问题,所以在hashmap中,解决了这个问题,也就是当你这个链表的长度大于等于8之后,这个链表就会转化成红黑树,当减小到6之后又会还原到链表。          

哈希函数是核心

当一个哈希函数设计好之后,能很大地提升性能。如果设计不好,就会一直发生冲突,一直撞。

设计哈希函数的方法:直接定址法,数字分析法,折叠法,随机数法和除留余数法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值