数据结构-Hash

术语

  • 散列表(哈希表)

散列表英文就是Hash Table,也就是我们经常说的哈希表,散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来.可以说,如果没有数组,就没有散列表。

  • 散列函数

对N取模x=x,其实这就是一个散列函数。也就是大家经常看到的Hash(key),这个Hash函数就是我们说的散列函数。我们是通过它来计算散列的值的。

  • hashCode

java里面调用hashCode()方法其实给我们返回的就是一个jvm堆里面存储该对象数据的一个虚拟地址(哈希值),不同虚拟机实现可能不同


Hash碰撞

就是经过hash函数处理后得到的值一样

解决方法

1.开放寻址(线性探测)

在这里插入图片描述

  • 插入

20%10=0,发现0已经有数据了则向下探测,直到没有数据的空位置则插入

  • 查找

查找20的时候就是20%10=0,发现0不是想要的20数据,继续线性探测,但会出现问题,假如删除了1的数据,它线性探测发现1空了,就会返回null,找不到,其实是有的,这时候我们可以加一个delete标记位,找的时候就继续往下找

2.链路地址(使用链表)

在这里插入图片描述

优点,使用简单,插入和删除容易(修改指针即可)

缺点:遍历慢

针对链表缺点遍历慢的问题,我们可以使用高级数据结构二叉查找树去解决

在这里插入图片描述

HashMap(JDK1.8)

  • 优点:速度快
  • 缺点:线程不安全,存不了大数据

初始大小: HashMap默认的初始大小是16,这个默认值是可以设置的,如果事先知道大概的数据量有多大,可以通过修改默认初始大小,减少动态扩容的次数,这样会大大提高HashMap的性能。

动态扩容:最大装载因子默认是0.75,当HashMap中元素个数超过0.75*capacity (capacity表示散列表的容量)的时候,就会启动扩容,每次扩容都会扩容为原来的两倍大小。

Hash冲突解决办法:JDK1.7底层采用链表法。在JDK1.8版本中,为了对HashMap做进一步优化,我们引入了红黑树。而当链表长度太长(默认超过8)时,链表就转换为红黑树。我们可以利用红黑树快速增删改查的特点,提高HashMap的性能。当红黑树结点个数少于8个的时候,又会将红黑树转化为链表。因为在数据量较小的情况下,红黑树要维护平衡,比起链表来,性能上的优势并不明显。

HashTable

  • 优点:线程安全
  • 缺点:影响性能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hash数据结构是一种使用哈希函数对数据进行映射的数据结构。它可以实现高效的数据查找、插入和删除操作。 脑图是一种用于整理和呈现信息的图形工具。通过将相关的概念和信息以节点的形式连接起来,脑图可以帮助我们更好地理解和记忆知识。在脑图中,我们可以使用不同的形状和颜色来表示不同的概念和关系,使得信息更加直观和易于理解。 将hash数据结构与脑图相结合,我们可以使用脑图来更好地理解和记忆hash数据结构的特点和操作。 首先,我们可以使用一个节点来表示hash数据结构本身。在这个节点的下方,我们可以列出hash函数、哈希表和关联数组等与hash数据结构相关的概念。通过连接这些节点,我们可以形成一张关于hash数据结构的脑图。 在hash数据结构的节点下方,我们可以展示不同的操作,比如插入、删除和查找。对于每个操作,我们可以使用不同的节点来表示,然后将它们与hash数据结构的节点相连。这样,我们就可以清晰地看到每个操作与hash数据结构之间的关系。 此外,我们还可以使用颜色或者形状来表示不同的操作的特点。比如,我们可以使用绿色来表示插入操作,使用红色来表示删除操作,使用蓝色来表示查找操作。通过使用不同的颜色,我们可以更加直观地看到不同操作之间的区别和联系。 综上所述,使用脑图来呈现hash数据结构可以帮助我们更好地理解和记忆它的特点和操作。通过将相关的概念和操作连接起来,并使用不同的颜色和形状进行标记,我们可以形成一张清晰直观的脑图来帮助我们学习和应用hash数据结构

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值