hashMap 1.7版本是一个由对象数组+链表 实现的数据结构 1.8 就是数组+链表/红黑树
他的核心实现原理在put方法上 put方法的逻辑大概是这样子的 a 通过key值 hash算法计算获取 hash值 b hash值与上tab 长度-1 得到下标 c 如果节点不存在没有发生碰撞就保存数组中 d 如果碰撞了就判断链表长度是否超过8 超过就变成红黑树 没有就添加到链表的尾部 f 如果节点存在就覆盖之前的值 g 如果数组超过 扩容因子0.75*数组长度 就需要扩容
衍生的问题
1、为什么使用数组+链表结构
因为存在hash碰撞问题 导致增加了链表结构
2、为什么扩容需要是2 n幂运算
扩容后减少元素的移动 使元素均匀的分布在数组中 减少hash碰撞 如果扩容不为2的倍数比如为10的话会产生大量的hash碰撞
3、key跟value是可以为null吗
可以的 但是key只能存在一个为null的 value可以多个为null