登陆

带你走进Java调集-HashMap源码-put办法图解实战

admin 2019-05-14 475人围观 ,发现0个评论

上一篇文章咱们从源码视点对HashMap的put办法进行了解析,这一篇文章我使用图解的办法来进行剖析。首要看一下网上一个比较好的流程图:

实例:依照正常的流程走一下put办法

榜首行代码:Mapmap = new HashMap<>();
第二行代码:map.put(null,10);
第三行代码:map.put("dd",null);
第四行代码:map.put(null,null);
第五行代码:map.put("a",1);
第六行代码:map.put("c",2);
第七行代码:map.put("b",3);
第八行代码带你走进Java调集-HashMap源码-put办法图解实战:map.put("a",4);
第九行代码:map.put("d",5);
第十行代码:map.put("e",6);
第十一行代码:map.put("f",7);
第十二行代码:map.put("g",8);

1.榜首行代码履行:实例化一个map调集,从这一篇文章中咱们知道,当调用new HashMap()结构函数时,HashMap就做了如下内容:

public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
只做了一件事,便是把加载因子默认成0.75.并没有初始化底层的数组。aslsdtkln

2:第二行代码:map.put(null,10),此带你走进Java调集-HashMap源码-put办法图解实战刻key=null,value=10,从上一篇剖析put源码中,咱们并没有看到假如key==null的话,就会抛出反常,所以记住一点:HashMap答应key为null.

当榜首次调用put时,他首要带你走进Java调集-HashMap源码-put办法图解实战会判别底层数组是否被初始化,假如没有初始化,则先进行初始化,源码如下;

if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;

走到这一步的图示如下:

初始化完结今后,会持续下面的刺进逻辑

1)首要算出key=null在数组的下标:i = (n - 1) & hash=(16-1)&hash(null)=0
2)然后把此下标的值赋给变量:p=tab[i]=tab[0]
3)判别p==null,则把(null,10)封装成Node,放到此下标中

通过这一步:图示如下:

第三行代码:map.put("dd",null),也会通过第二步代码的流程,可是此刻底层数组现已被初始化了,所以不再进行初始化,而是直接进行刺进:

1:首要算出key="dd"在数组的下标:i=(n-1)&hash=(16-1)&hash("dd")=0
2:然后把此下标的值赋给p=tab[i]=tab[0]
3:判别p!=null,所以持续下面的逻辑
4:key=null和key="dd"的hash值是持平的,所以接下来判别两者的key是否持平,null!="dd",所以持续下面的逻辑。
5:判别是否是红黑树TreeNode,判别不是,所以持续下面逻辑,把("dd",null)插到链表的结尾。

第四行代码:map.put(null,null)

1:首要算出key="dd"在数组的下标:i=带你走进Java调集-HashMap源码-put办法图解实战(n-1)&hash=(16-1)&hash(null)=0
2:然后把此下标的值赋给p=tab[i]=tab[0]
3:判别p!=null,所以持续下面的逻辑
4:key=null现已存在了HashMap中,咱们的onlyIfAbsent=false所以掩盖

早年四行代码中咱们总结如下:

1:榜首次调用put()办法时,会对底层数组进行初始化,只会初始化一次
2:HashMap可认为key=null,value=null,在null值上,HashMap并没有做特别的处理。

其他几行依照上面的过程,履行完后如下:

从上带你走进Java调集-HashMap源码-put办法图解实战面的比如咱们能够看出,即便HashMap带你走进Java调集-HashMap源码-put办法图解实战的底层数据结构是数组+链表+红黑树,可是HashMap的hash处理的十分的好,一般用不到红黑树。

假如你对HashMap的put逻辑十分的清楚,是十分好了解的,下一篇文章我会对HashMap的扩容机制resize()进行源码剖析。

  • 南水北调中线工程通水近5年来直接获益人口超5859万
  • 请关注微信公众号
    微信二维码
    不容错过
    Powered By Z-BlogPHP