写点什么

HashMap 源码分析 (六)

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

    阅读完需:约 5 分钟


🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家,51CTO 明日之星

📌 擅长领域:全栈工程师、爬虫、ACM 算法

💒 公众号:知识浅谈


HashMap 源码分析(六)总结


正菜来了⛳⛳⛳

🎈HashMap 中的相关函数分析

🍮class KeySet

上篇文章中提到的函数 keySet() 函数返回的是一个 KeySet 的对象,关于 KeySet 对象的操作如下。


final class KeySet extends AbstractSet<K> {    public final int size()                 { return size; }    public final void clear()               { HashMap.this.clear(); }    public final Iterator<K> iterator()     { return new KeyIterator(); }    public final boolean contains(Object o) { return containsKey(o); }    public final boolean remove(Object key) {        return removeNode(hash(key), key, null, false, true) != null;    }    public final Spliterator<K> spliterator() {        return new KeySpliterator<>(HashMap.this, 0, -1, 0, 0);    }    public final void forEach(Consumer<? super K> action) {        Node<K,V>[] tab;        if (action == null)            throw new NullPointerException();        if (size > 0 && (tab = table) != null) {            int mc = modCount;            for (int i = 0; i < tab.length; ++i) {                for (Node<K,V> e = tab[i]; e != null; e = e.next)                    action.accept(e.key);            }            if (modCount != mc)                throw new ConcurrentModificationException();        }    }}
复制代码

🍮Collection<V> values()

含义:返回此映射中包含的值的集合视图。集合由 map 支持,因此对 map 的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。它不支持 add 或 addAll 操作。


public Collection<V> values() {    Collection<V> vs = values;    if (vs == null) {        vs = new Values();        values = vs;    }    return vs;}
复制代码


上边的 Values 是内部类,和上边的 KsySet 一样。

🍮Set<Map.Entry<K,V>> entrySet()

含义:这个 entrySet 中主要是返回这个集合中对象的一个键值对的列表,当为 null 的时候,创建一个新的 EntrySet 对象,否则返回已经存在的对象。


public Set<Map.Entry<K,V>> entrySet() {    Set<Map.Entry<K,V>> es;    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;}
复制代码


上边提到的 EntrySet 对象是内部类。

🍮V getOrDefault

含义:这个函数的含义就是根据具体的 key 返回对应的对象,函数内部会调用 getNode 函数返回指定的 Node 对象,如果没有的话就返回传入的默认值。


public V getOrDefault(Object key, V defaultValue) {    Node<K,V> e;    return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;}
复制代码

🍮V putIfAbsent(K key, V value)

含义:这个函数的含义就是吧 map 中不存在的键值对插入,第四个参数的含义是 onlyIfAbsent,当这个表示为 true 的时候,表示的是当 map 中不含有这个键值对的时候才进行插入的并返回插入的键值对的 value 值。


public V putIfAbsent(K key, V value) {    return putVal(hash(key), key, value, true, true);}
复制代码

🍮boolean remove(Object key, Object value)

含义:这个函数的意思就是移除对应的 key 和 value 对应的键值对,函数内部还是调用 removeNode 这个函数,第一个参数是 key 的 hash 值,第二个和第三个是对应的 key 和 value 值。


public boolean remove(Object key, Object value) {    return removeNode(hash(key), key, value, true, true) != null;}
复制代码

🍚总结

以上是关于 HashMap 中的相关的函数的解析,希望有所帮助,Written By 知识浅谈

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

知识浅谈

关注

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

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

评论

发布
暂无评论
HashMap源码分析(六)_hashmap_知识浅谈_InfoQ写作社区