hashmap的put方法的实现原理,首先table是否为空,如果table为空的话,那么他会进行这个扩容,第一次的话hashmap他默认是16的一个容量,那么如果不为空的话,他就会计算这个数组的一个下标,那么数组下标的一个计算方式是需要用到我们的这个hashcode,以及table.length-1进行一个&操作,那么如果key存在呢?我们hashmap里边会走一个直接覆盖的一个操作,那么如果key不存在的,而这个时候呢,对于jdk1.7来说,其实没有太多的一个操作,那么它就会直接而进行判断,因为他确定下边要么是链表啊,要么就是有一个槽位,那么但是对于这个jdk1.8来说,他还需要进行一个判断,是不是当前桶位上是这个树结构,或者是这个链表结构.如是这个链表结构的话,它在源码层面,他还要判断,我添加上这一个元素之后,它是不是会导致这个从链表转化为这个红黑树,这是他的一个前面的一个操作. 那么对于这个添加来说,它也会涉及到一个实质性的问题就是hashmap的一个扩容,就是说当我们的这个hashmap,当然了,这需要看hashmap他里边的一个负载因子,还有他的当前的一个容量,基本上负载因子的话,默认情况下是0.75,也就是说,如果达到这个阈值的话,他会选择一个扩容,那么在细节上来说的话,hashmap插入数据的时候,他put方法里边的是有四个参数,那么着重说一下第1个参数. 第1个参数其实是这个哈希值,那么哈希值他是通过这个key的hashcode"异或"自身右移16位这样得到的一个值{(h = key.hashCode()) ^ (h >>> 16);},那么拿到这个值之后,他会对跟这个table,也就是数组的一个长度,hashmap的一个size,size减一,也就是二的n次方减一进行&操作,然后定位数组里边,他的一个槽位,那么定位完槽位之后呢,才是接下来去判断它是链表一个数组,当然这是说的jdk1.8的这个情况啊,那么这边他其实是涉及到一个扰动的一个处理,那么就是hashcode,他的一个计算方式,它是一个自身"异或"自身右移16位,这样得出来的一个值,这样的话其实就完成了他的一个寻址,剩下的其实就是一个内存空间的一个开辟,在扩容的时候已经开辟过了,然后就是我理解的put方法实现原理.
在看源码之前看了一个大佬写的一篇解释put方法的文章,读了之后很多点都不理解,带着问题去看源码,并结合大佬的文章,辅助我去理解,这是在现在的知识认知量理解的程度,对知识掌握量变大之后还会再次深入理解底层的结构!欢迎各位给出不同意见并指点,