一、hashmap的数据结构 底层数组+单向链表,jdk1.8后,链表长度大于8,并且数组长度大于64,将转为用红黑树存储 二、hashmap用了hash为什么还要equals 因为hash也会重复,hash重复但是值不一定相等,所以要使用equals进行判断 三、hashmap中put方法的过程 计算hash值, key.hashCode()>>>16,用高16位和低16位进行异或运算(二进制按位比较,如果相同则为 0,不同则为 1)。 然后根据hash值计算出数组下标(跟数组长度进行与运算),将元素放入数组中,如果没有出现哈希冲突,则直接放入数组,如果出现哈希冲突,则以链表的方式放在链表最后(jdk1.7使用头插法,也就是放在链表最前面,jdk1.8使用了尾插法,放在了链表最后面)。 如果链表的长度超过8,并且数组长度大于64,就把链表转成红黑树,如果链表长度低于6,就把红黑树转回链表; 如果数组中键值对的总量超过了阈值(负载因子0.75),会进行动态扩容。 四、负载因子是什么 负载因子用来实现hashmap动态扩容,默认0.75是在时间和空间上折中的一个选择。 扩容阈值计算...