数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构。
哈希表使用数组作为主干,实现查找,插入,删除元素的时间复杂度为O(1)。
哈希表(key,value) 就是把Key通过一个固定的算法函数既哈希函数转换成一个整型数字,然后将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)
使用哈希表进行查询的时候,再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,当多个键被哈希到同一个下标时,处理哈希碰撞冲突。
哈希冲突处理方法:
开放定址法
链地址法
…
扩容:HashMap构造方法并没有对内部的table数组初始化,可能是为了防止未使用的情况下浪费内存。当初次执行插入,如果数组为空就会初次调用扩容方法resize()创建table数组。
如果未指定HashMap的构造方法参数,数组初始长度为DEFAULT_INITIAL_CAPACITY(16),加载因子为DEFAULT_LOAD_FACTOR(0.75)。开发者也可以通过HashMap的构造方法指定初始长度和加载因子。
HashMap的容量超过当前数组长度*加载因子,就会执行resize()算法,该算法将创建一个新的数组,长度是原来的两倍(旧的长度左移一位),并且将原来的HashMap数组的节点转换到新的数组。同时threshold变量也会是原来的两倍,该变量用来判断HashMap在插入后是否应该扩容。