仅适合看过源码的朋友们~~
首先关于这个put方法,通过源码分析我们可以发现,put方法传参是key,value。那么其实
里面有一个方法putVal(),hash就是低16位与高16位异或得到。
那么我们来看putVal,通过观察源码我们可以分析大概为四种情况:
1.slot为空 我们直接通过寻址算法(table.length - 1 & hash) 找到数组下标
然后newNode()包装完之后丢进下标就可以了
2.slot不为空的情况 还未被链化,需要对比一下,对比这个key和put进来的key是否一致,
如果一致的话就做一个替换操作,如果不一致的话就是一波hash冲突了,那么如果这种情况
的话,这种情况就用尾插的方式插入进链表里面去
3.这种情况就已经链化了,跟第二种情况相似,需要我们去进行对比一下,对比进来这个key
和put进来的key是否一致,一致的话就进行替换操作,如果不一致的话用尾插法的形式给它
插到链表尾部就好了,这个还没完,如果这个时候就要去比较树化阈值,如果达到这个树化
阈值的话,就需要调用这个树化方法,这个树化操作都在该方法里完成
4.就是很严重的情况了,那个链表已经转成红黑树了