HashMap源码分析(六)

举报
知识浅谈 发表于 2022/10/23 09:57:56 2022/10/23
【摘要】 HashMap源码分析(六)

在这里插入图片描述

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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