Map (五) HashMap get()

本文深入剖析了HashMap的get()方法实现,详细介绍了其通过hash计算查找元素的过程,包括数组检查、元素匹配、链表遍历及红黑树节点搜索等步骤。

首先打开源码:

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

可以看到,get() 主要方法还是调用 getNode() 所以我们重点看一下这个方法:

    final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
            if (first.hash == hash && // always check first node
                ((k = first.key) == key || (key != null && key.equals(k))))
                return first;
            if ((e = first.next) != null) {
                if (first instanceof TreeNode)
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        return e;
                } while ((e = e.next) != null);
            }
        }
        return null;
    }

如果看过前面几篇文章,看到 get() 方法以后会觉得如此简单。流程:

  1. 判断数组是否不为null,数组长度是否大于0,使用 hash 计算当前存储位置是否有元素
  2. 判断当前位置存放的元素是否相同
  3. 判断当前位置存放的元素是否有 next ,即下一个元素
  4. 判断当前位置存放的是否是红黑树
  5. 遍历链表
  6. 如果都找不到相同的 key 就是返回 null

看完前面复杂的 put()resize() 方法以后,感觉 get() 方法是最为简单的。明白了前面两个方法,在看这个方法一看就知道什么意思啦。所以在这里我就不多说了,不明白的先看看前面的几篇哦。

如果有那些讲的不好或者讲的不仔细的地方,欢迎评论留言。


Map (一) HashMap 构造函数的秘密
Map (二) HashMap put()方法详细解刨
Map (三) HashMap 如何利用 hash 计算存储位置
Map (四) HashMap 已故事的角度理解 resize()
Map (五) HashMap get()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值