写点什么

HashMap 源码分析 (三)

作者:知识浅谈
  • 2022-10-21
    吉林
  • 本文字数:1345 字

    阅读完需:约 1 分钟


🍁 作者:知识浅谈,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 知识浅谈

发布于: 刚刚阅读数: 4
用户头像

知识浅谈

关注

公众号:知识浅谈 2022-06-22 加入

🍁 作者:知识浅谈,InfoQ签约作者,CSDN博客专家/签约讲师,华为云云享专家,阿里云签约博主,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥 联系方式vx:zsqtcc

评论

发布
暂无评论
HashMap源码分析(三)_HashMap底层原理_知识浅谈_InfoQ写作社区