1.hashmap只是一个数据结构,首先要把hash和map拆开来看,map是这种集合所存储的数据类型,是KV键值对,hashmap也是派生自map接口,hashmap利用数组下标可以随机访问的特性,实现了可以快速存取的树结构,且时间复杂度是接近O1的。
2.存入和获取:首先对存入的数据进行一个hash运算,得到它应该所处的数组的下标位置,根据key来调用他的hashcode方法来得到hash值。hashmap使用高位和低位进行异或运算,目的是让高位和低位都能参与运算,使得hash值分布的更均匀。获取数据也是如此,通过hash算法得到具体的数据所在的下标值来直接获取。但我们不能保证两个不一样的数据的hash值不一样,再加上数组下标是一样的,所以发生hash碰撞是不可避免的。
3.hashmap选择了链表法来解决hash碰撞。
4.数组一但被创建,那么他的长度将不能被改变,,hash表的性能就会从O1无限趋于On,这时不得不去扩容,扩容是在新的内存地址当中开辟一片空间,创建一个心的数组来进行数据的存储。
5.这时扩容因子或叫负载因子出现了,当我们hash表当中的数据的总个数大于等于数组的长度乘以扩容因子的长度时区扩容。