这章简单分析一下HashMap源码 初始化和put源码
后面我会接着给大家分析 HashMap如何从数组 转为链表 在转为红黑树 和扩容
在了解红黑树之前 需要先了解二叉树的数据结构 二叉搜索树 之前的文章我有介绍过二叉搜索树的代码 添加和查找 但是删除代码有点问题 大家理解二叉树的原理就行
好了废话不多说 直接上干货
首先HashMap初始化 默认16位数组长度 阀值为数组长度*0.7 得12 数组在put的时候才会初始化,所以刚开始只记录 loadFactor 和threshold
我们可以看到上面这个方法 这个方法可以保证hashMap的大小永远为2的N次幂最进阶我们设置的值 |包含了^和&的取值
进行put的时候 首先计算hash值 首先根据key的hashCode求出hash,然后hash右移16位与hash原始值相比,得出中间位
可以看到进行了^运算 比如二进制1001 ^ 1000 将会得出0001 hash值为1
首先为们可以看到 如果table为空 进行初始化
拿到数组的长度oldcap和hashMap的threshold如果初始化指定了长度则为指定的长度这个长度为2的N次幂最接近当前设置的大小 比如设置为7 则长度为8 ,如果没有指定则为0 默认为16
然后初始化完全返回newTab
之后在回到刚才
根据数组长度n-1&hash 得出索引值 比如101011 001011 为 001011 然后存入数组
最后执行size+1 比较是否超过阀值 我们可以看到 afterNodeInsertion(evict)这个方法是代表是否需要保留插入顺序 如果使用的话 我们就需要使用LinkedHashMap
暂时先简单介绍到这里 HashMap初始化和put
后面会相续介绍HashMap扩容和链表、红黑树的产生