java容器类:HashMap(实现原理)
散列表查找(哈希表)概述#
java容器类之一的HashMap是根据散列表的原理来实现的,因此先介绍散列表 .
散列表查找定义##
散列技术————通过查找关键字不需要比较就可获得需要的记录的存储位置.
__散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个
key对应一个存储位置f(key)__。
查找时,根据这个对应关系找到给定值key的映射f(key),
若查找集合中存在这个记录,则必定在f(key)上。
这种对应关系f称为散列函数,又称为哈希(Hash)函数.按这个思想,采用散列技术将
记录存储在一块连续的存储空间中,这块连续空间称为散列表或哈希表(Hash table)。
散列表查找步骤##
- 在存储时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。
- 当查找记录时,我们通过同样的散列函数计算记录的散列地址,按词散列地址访问记录。
但是中间会存在一个问题:关键字不一致,但是关键字所得出的散列地址却相同,这种现象称
为__冲突(collosion)__,这种冲突在我们设计出的散列函数要尽可能的少。
散列函数的构造方法##
设计好的散列函数的两个原则:
- 计算简单
- 散列地址分布均匀
具体的构造方法有:
直接定址法
数字分析法
平方取中法
折叠法
除留取余法
随机数法
HashMap中使用的是除留取余法.
处理散列冲突的方法##
- 开方定址法
- 再散列函数法
- 链地址法
HashMap中使用的是再散列法
关于构造方法和处理散列冲突方法,可以阅读《大话数据结构》。