散列表(HashTable、HashMap)
散列表,也称哈希表(HashTable)是一种数组+链表的数据结构(拉链法),解决hash冲突。
Hash冲突:key-value的结构,key的hash值可能会相同产生冲突(不能放在同一个数组位置上)
所以用拉链法放将冲突到链表里,为了保证哈希表查找容易,希望链表不要太长,冲突分布均匀
常用取余法(key mod p, p取素数为好),使hash值均匀分布。
1、拉链法 解决hash冲突
引用:https://blog.youkuaiyun.com/donghejk/article/details/83781932
拉链法:加链表、放冲突。拉链法查找分为两步,首先是根据散列值(hash值)找到放冲突的链表,然后沿着链表顺序找到相应的键。
散列地址是链表的头结点,期望数组可以足够大(扩容问题),链表可以足够小(均匀分布问题),这样查找效率高。
2、散列表如何扩容
数组是无法自动扩容的,达到阈值后,使用一个新的数组代替已有的容量小的数组。Hashtable的扩容方法rehash:
//hashtable的扩容
protected void rehash() {
int oldCapacity = table.length;
Entry<?,?>[] oldMap = table;
// overflow-conscio