hashmap

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

              boolean evict) {

Node[] tab;

    Node p;

    int n, i;

    //此处会有线程安全。

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

//如果数组为空,进行数组初始化

        n = (tab = resize()).length;

    }

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

//通过位运算,获取i 的下标,判断是否有元素,如果没有重新创建一个。

        tab[i] = newNode(hash, key, value, null);

    }else {

Node e;

        K k;

        //如果值相等,进行值得替换。

        if (p.hash == hash && ((k = p.key) == key || (key !=null && key.equals(k)))) {

e = p;

        }else if (pinstanceof TreeNode) {

//判断节点的类型是不是树,将元素插入到树中。

            e = ((TreeNode) p).putTreeVal(this, tab, hash, key, value);

        }else {

//如果节点的类型是数组。(binCount 链表得长度。)

            for (int binCount =0; ; ++binCount) {

//如果链表最后一个元素等于空得时候进行了尾插入。

                if ((e = p.next) ==null) {

//进行尾插入。

                    p.next = newNode(hash, key, value, null);

                    //当链表长度是8的时候进行树化。

                    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;

            }

}

if (e !=null) {

// existing mapping for key

            V oldValue = e.value;

            if (!onlyIfAbsent || oldValue ==null) {

e.value = value;

            }

afterNodeAccess(e);

            //将老的值return

            return oldValue;

        }

}

++modCount;

    //当前数组元素的个数。

    if (++size >threshold) {

//进行扩容。

        resize();

    }

afterNodeInsertion(evict);

return null;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。