HashMap源码解读
1. HashMap的数据结构
总的来说hashmap中用到了链表、数组、红黑树这三种数据结构。不同hash值的key放在对应的数组中,当存在hash冲突时,将相同hash值的key用链表保存起来,当链表长度以及所有k-v对的个数达到阈值时,链表就会“树化”为红黑树,以提高查找效率。
2. HashMap的扩容和负载因子
区分两个概念:capacity
、size
size
:指的是map中不同key-value键值对的总个数,这个字段会暴露给我们。capacity
:指的是map中buckets的个数,即table数组的长度
当我们在初始化一个map的时候,默认负载因子为0.75f
,当size达到0.75 * capacity
时,就会进行扩容,map的扩容是2倍扩容。
table的长度始终都是2的指数次幂,当我们指定的初始化长度不是2的次幂时,会调用tableSizeFor
方法自动找到刚好大于该长度的2的次幂的数。默认初始化时table的长度是16。