JAVA基础:集合
总结:
哈希表
哈希表就是散列表,将输入的值通过hash函数映射出一个相对应的数字就是索引,最后就形成了k-v键值对的形式
为什么用哈希表
就相当于一个密码对照表,因为无法逆向解密,所以把所有(或部分)hash预先算出来做成一个表,并记录与之对应的密码,当我们知道一个hash想解密是,就到这个表里进行查询,若有相同的hash存在,则知道了其对应的密码为什么要做这样一个表呢,就是为了提高破解速度,如果我们直接进行暴力破解,每一个密码都要进行计算得到hash,再将它与已知hash进行对比,这个计算过程会很耗时,有表的情况下只需要读取进行对比就可以了,速度上要快得多
用哈希表的好处
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
哈希表(散列表)主要特点:
1.将输入映射到数字
2. 不同的输入产生不同的输出
3. 相同的输入产生相同的输出
4. 当填装因子超过阈值时,能自动扩展。填装因子 = 散列表包含的元素数 / 位置总数,当填装因子 =1,即散列表满的时候,就需要调整散列表的长度,自动扩展的方式是:申请一块旧存储容量 X 扩容系数的新内存地址,然后把原内存地址的值通过其中的 key 再次使用 hash 函数计算存储位置,拷贝到新申请的地址。
5. 值呈均匀分布。这里的均匀指水平方向的,即数组维度的。如果多个值被映射到同一个位置,就产生了冲突,需要用链表来存储多个冲突的键值。极端情况是极限冲突,这与一开始就将所有元素存储到一个链表中一样。这时候查找性能将变为最差的 O(n),如果水平方向填充因子很小,但某些节点下的链表又很长,那值的均匀性就比较差。