主流的hash算法概述及在JDK Map中的应用

本文介绍了哈希算法在Java Map中的应用,探讨了除余法、MAD法、数字分析法和随机数法等主流哈希算法,并讨论了哈希碰撞的解决方案,如封闭定址法和开放定址法。同时,详细解析了HashMap、HashTable和ConcurrentHashMap的哈希策略,包括JDK8中对HashMap的改进,如链表转红黑树以优化性能。
摘要由CSDN通过智能技术生成
hash算法的应用场景

Java中的Map实际是一个“散列表”的数据结构,散列表是逻辑上由一系列可存放词条(或其引用)的单元组成,故这些单元也称作桶(bucket) —— 一般都使用线性表来实现。

一组词条在散列表内部的具体分布,取决于所谓的散列(hashing)方案:事先在词条与桶地址之间约定的某种映射关系,可描述为从关键码空间到桶数组地址空间的函数: hash() 。

这里的hash()称作散列函数(hash function)。反过来,hash(key)也称作key的散列地
址(hashing address),亦即与关键码key相对应的桶在散列表中的位置。

所有散列函数都有如下一个基本特性:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同。对于java而言即如果 hashcode方法返回相同,equals方法不一样返回相同。但equals方法返回相同,则hashcode必须相同。

最佳的情况是充分利用有限的散列表空间,即散列函数最好是满射(定义域R与散列表的单元一一对应)。

当然,因定义域规模R远远大于散列表空间规模,散列函数不可能是单射。这就意味着,关键码不同的词条被映射到同一散列地址的情况称作散列冲突(collision)。

主流的hash算法有如下:

除余法:
将散列表长度M取作为素数(只有为素数才能让其分布更加均匀http://zhao

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值