1.什么是哈希表?
哈希表(Hash Table)的是数组与链表/二叉树的结合,其中哈希是指哈希函数。
哈希函数的主要功能是将一个值经过加工而得到另外一个值。这种函数的特点就是输出的空间远小于输入的空间
2.哈希表的存储方式
哈希表是数组+链表/二叉树的方式来实现的数据结构。其中数组的下标就是由哈希函数计算得到的结果。下标对应的位置存储的就是一个键值对。
3.哈希冲突
同的数据输入哈希函数后可能得相同的结果,此时称为哈希冲突。
解决哈希冲突的办法:开放寻址法和拉链法。
开放寻址法:寻找空白的位置插入,相关的方法有线性探测 、二次探测 、再哈希法。java中的ThreadLocal就是采用了开放寻址法
拉链法:在哈希值相同的地方形成一个链表/二叉树。对于Java中的HashMap,当链表长度超过8时链表会转化成树结构,提升性能。
4.哈希表的扩容
当哈希表的位置被占的比较多的时候,更容易出现哈希冲突。因此引入了增长因子的概念。
增长因子是被占的位置和所有位置的百分比,当这个百分比达到时,就触发扩容。而且这个扩容也不是简单的把数组扩大,而是新创建一个数组是原来的2倍,然后把原数组的所有键值对都重新Hash一遍放到新的数组。因为数组扩大了,所以一般哈希函数也会有变化,这里的Hash也就是把之前的数据通过新的哈希函数计算出新的位置来存放。
参考文章: