我是靠谱客的博主 欢呼黄蜂,这篇文章主要介绍Java基础 -> 说说HashMap的Put方法的大体流程说说HashMap的Put方法的大体流程:,现在分享给大家,希望可以做个参考。

说说HashMap的Put方法的大体流程:

  1. 根据Key通过哈希算法与与运算得出数组下标
    tab[i = (n - 1) & hash]

  2. 如果数组下标位置元素为空,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中 是Node对象)并放⼊该位置
    tab[i] = newNode(hash, key, value, null);

  3. 如果数组下标位置元素不为空,则要分情况讨论

    1. 如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进⾏扩容,如果不⽤扩容就⽣成Entry 对象,并使⽤头插法添加到当前位置的链表中

    2. 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红⿊树Node,还是链表Node

      1. 如果是红⿊树Node,则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去,在这个过程中会判断红⿊树中是否存在当前key,如果存在则更新value

        e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);

      2. 如果此位置上的Node对象是链表节点,则将key和value封装为⼀个链表Node并通过尾插法插⼊到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插⼊到链表中,插⼊到链表后,会看当前链表的节点个数,如果⼤于等于8,那么则会将该链表转成红⿊树

        复制代码
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st //树 treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; }
      3. 将key和value封装为Node插⼊到链表或红⿊树中后,再判断是否需要进⾏扩容,如果需要就扩容,如果不需要就结束PUT⽅法

        if (++size > threshold) resize();

大帅比,点赞了没?

最后

以上就是欢呼黄蜂最近收集整理的关于Java基础 -> 说说HashMap的Put方法的大体流程说说HashMap的Put方法的大体流程:的全部内容,更多相关Java基础内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部