- 散列表也叫哈希表,提供key-value的映射关系
- 通过hash(key)找到所匹配的value,时间复杂度接近于o(1)
- 底层是一个数组
散列表的写put操作
在数组中插入一个个entry: 通过hash函数转化为数组的下标index, 但当插入的entry越来越多时,获取的下标可能是相同的,就会出现hash冲突, 解决的办法有:
- 开放地址法
当我们插入一个新的entry时如果发现当前位置已经被占用,可以按照某种寻址法去找另外的空档位置 - 链表法
hashmap数组中每个元素存储的是一个链表的头结点:当新来的entry映射到与之冲突的数组位置时就直接插入到当前位置的链表即可
散列表的读get操作
- 通过哈希函数得到数组下标index
- 通过index找到对应元素。如果当前元素不是想要的value,可以顺着当前链表往下找
散列表的扩容
-
为什么要进行扩容?
当插入很多entry之后,散列表会达到一定的饱和度,发生哈希冲突的概率会提高,某个位置的链表会很长,从而影响查询效率,就需要扩容来缓解 -
扩容的条件
当hash table的长度>当前的长度*负载因子(0.75) -
如何扩容
- 创建一个新的entry数组,长度是原来的2倍
- 重新hash:遍历源entry数组,把所有的entry 重新hash到新的数组当中
常见的哈希结构:1)数组 2)set(集合) 3)map(映射),其中set 与map的区别如下: