HashMap的原理
HashMap底层是一个链表散列的数据结构,也就是数组加上链表的结构。
当我们调用put方法加入一个entry的时候,首先会对entry的key值进行hashCode计算,从得到的hash值算出这个entry需要被插入到数组的哪一个下标位置。计算的方式是hash & (length - 1),hashMap的数组长度永远是2^n所以,length-1 的二进制形式就是111111,这样保证所有的下标位置都能有数据插入。
如果计算出来的下标位置已经有entry了,那么就用链表形式的结构,将下标相同的entry都放入这条链表上。
读取元素和插入的原理相同,找到key值对应的下标位置,然后遍历这条链表上的所有元素,进行equals判断,如果相等,那么返回这条数据。
HashMap的resize,hashMap的初始大小默认是16,负载因子默认0.75。为了提高查询效率,避免链表太长效率太低,所以当数组的占用超过了length*负载因子,那么hashMap就会扩容,让数组长度翻倍。同时数组长度变化了,那么每一个entry计算的下标自然不一样了,也就是所有的entry都需要被重新排序插入。这个是一个很大的性能消耗,如果我们能够预先知道我们的hashMap大概会存储多少数据,那么就可以提前构建一个合适大小和负载因子的HashMap,从而优化性能了。
参考文章:HashMap原理总结