深入分析HashMap
每个学生都有学号、姓名、年龄、身高等信息,其中学号是学生的唯一标识,要把学生存储起来,并可以通过学号快速查找。 我们很自然的想到数组( 数组支持按照下标随机访问,时间复杂度O(1) ),将这些学生的信息放到数组里,但是我们又怎么通过学号从数组里查找到该学生的信息呢? 如果可以把学号映射到数组里的一个索引位置,这样我们就可以根据学号找到索引位置,进而查到学生的信息。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数 下面的hash函数用key的哈希码值对数组大小取余,来锁定数组的位置。 // 哈希函数必须把关键字的范围压缩到数组的范围,用取余操作来完成 public int hashFunc(String key) { return key.hashCode() % arraySize; // hash function } 散列冲突 如果不同的key经过hash函数,命中了数组的同一个索引位置,那怎么办? 再好的hash函数也无法避免散列冲突,常用的散列冲突解决方案有开放地址法和链地址法。 开放地址法 开放地址法的思想就是当前索引有冲突了,那么我就根据一定的规则找到其他空闲的索引位置。最简单的方式就是,每次当前索引+步长(比如1),向下查找,直到找到空闲的位置,当然也可以每次hash的时候改变步长。查找的时候也是每次当前索引+步长(比如1),向下查找,直到遇到空闲位置