HashMap源码分析(三)

举报
知识浅谈 发表于 2022/10/20 10:04:23 2022/10/20
【摘要】 HashMap源码分析(三)

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈

HashMap源码分析(三)总结
正菜来了⛳⛳⛳

🎈

🍮HashMap(int initialCapacity)

含义:这个函数的含义是执行初始容量的HashMap的构造函数,并且使用默认的加载因子,之后调用含有初始值何加载因子的构造函数。

public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

🍮HashMap()

含义:这个函数的意思是采用无参构造函数,使用默认的容量值和加载因子进行构造函数的创建。

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

🍮HashMap(Map<? extends K, ? extends V> m)

含义:构造一个与指定 Map 具有相同映射的新 HashMap。 HashMap 是使用默认加载因子 和足以容纳指定 Map 中的映射的初始容量创建的,函数的最后调用putMapEntries会把传递过来的map对象m中的键值对赋值给新创建的Map对象。

public HashMap(Map<? extends K, ? extends V> m) {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    putMapEntries(m, false);
}

接着我们继续看putMapEntries这个对象用法。

🍮putMapEntries()

含义:首先这个函数的主要作用就是相当于啊调用putAll把m对象中的键值对传递给新创建的对象中,
从下方的函数中可以看出先求出传递过来的m的大小,如果大小大于0,再进行下一步,如果s大于阈值threshold,调用resize()初始化或加倍表大小,然后对m这个对象进行遍历,分别把key和value填充到当前对象中。

final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
    int s = m.size();
    if (s > 0) {
        if (table == null) { // pre-size
            float ft = ((float)s / loadFactor) + 1.0F;
            int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                     (int)ft : MAXIMUM_CAPACITY);
            if (t > threshold)
                threshold = tableSizeFor(t);
        }
        else if (s > threshold)
            resize();
        for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
            K key = e.getKey();
            V value = e.getValue();
            putVal(hash(key), key, value, false, evict);
        }
    }
}

🍮int size()

含义:这个函数的含义就比较简单了,就是取出map中的size的大小。

public int size() {
    return size;
}

🍮isEmpty()

含义:这个函数的意思是查看对象是不是空,内部判断还是根据size是否为0来判断的。

public boolean isEmpty() {
    return size == 0;
}

🍮get(Object key)

含义:这个就是返回Map中对应的key这个键对应的值,但是内部调用可getNode这个函数获取key对应的value值,第一个参数是key对应的哈希值,第二个参数是这个key,调用这个函数返回对应的节点。

public V get(Object key) {
    Node<K,V> e;
    return (e = getNode(hash(key), key)) == null ? null : e.value;
}

上边的函数中调用了getNode()函数,具体的内容下篇文章中具体探究。

🍚总结

以上是关于HashMap类的相关源码的的一些函数的具体实现,希望有所帮助,Written By 知识浅谈

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。