https://blog.csdn.net/weixin_42759988/article/details/99665964
put方法的思路:
1.对 key 的 hashCode()做 hash,然后再计算 index;
2.如果没碰撞直接放到 bucket 里;
3.如果碰撞了,以链表的形式存在bucket next
4.如果碰撞导致链表过长(大于等于 TREEIFY_THRESHOLD 默认是8),就把链表转换成红黑树;
5.如果节点已经存在就替换 old value(保证 key 的唯一性)
6.如果 bucket 满了(超过 load factor(0.75)) * current capacity),就要 resize,变为当前大小的2倍
HashMap 初始大小计算:
一般我们都会调用无参的构造函数来初始话一个数组对象,所以默认的capacity是16,不用我们计算。
有参的构造方法,new HashMap(initail capacity: 10)这里我们给个初始容量10
但是初始话出来的table size是16,原理就是hashmap底层会用大于等于这个初始 capacity的2 幂次方,所以这里大于10的2的幂次方数是16,如果是17则是32.