这里讲数据结构哈希表,Java集合中的HashTable和HashMap.
1.哈希表
1.1介绍
哈希表也叫散列表(英文是Hash Table)是一种以 键-值(key-value) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
这种方法的好处:哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只需要调整哈希函数算法即可在时间和空间上做出取舍。
1.2哈希碰撞
不过,哈希表也有它自身的问题:
哈希碰撞(生日碰撞)即如果不同的输入得到了同一个哈希值,就发生了"哈希碰撞"(collision)
1.3哈希碰撞解决方法
如何解决哈希碰撞?
①开放定址法
如果遇到哈希冲突,找hash表剩下空余的空间,找到空余的空间然后插入。即哈希表中对应哈希值已有元素,就对应下一个元素。
②链地址法
如果遇到冲突,他就会在原地址新建一个空间,然后以链表结点的形式插入到该空间。
2.HashMap
2.1 Java集合
首先祭上两张图: