HashMap 添加源码分析

HashMap

 

碼源解析

 

添加源碼解析

 

resize()

 

這個方法在putval中執行,因為要確保你數組不是null

 

resize就是重新计算容量;向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素;当然java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组;就像我们用一个小桶装

putVal()
首次添加

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        
    
    ~~~~~
    
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

if ((p = tab[i = (n - 1) & hash) == null)

初始化完成后,他会去根据数组长度-1与计算的hash码进行与运算的出来放的数组位置,他会去看这个位置有没有元素

有呢就创建一个Node放到这个位置就可以了

如果不是null那就只能链表操作了,那个操作等会说

if (++size > threshold)
       resize();
afterNodeInsertion(evict);
return null;

之后呢,我们要变更size的大小,因为size是记录有多少个真正的元素在这个数组中,threshold就是临界值,我们初始化好了,这个值就是12,这个if呢就是为了判断,你添加到数组的元素,你不能大于这个临界值,那你要是大于了,那我就去扩容去了,否则了那就没事了

afterNodeInsertion(evict);

afterNodeInsertion(evict);

这玩意是为了LinkedHashMap服务的,是为了保证顺序而存在的,在hashmap中没意义。

文章链接: https://www.mfisp.com/13042.html

文章标题:HashMap 添加源码分析

文章版权:梦飞科技所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
建站教程投稿分享

Pyhon程序控制流程

2022-11-23 13:58:53

建站教程投稿分享

并发修改异常简介

2022-11-23 14:08:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

梦飞科技 - 最新云主机促销服务器租用优惠