HashMap源码分析JDK8:getNode方法

HashMap的底层数据结构
在这里插入图片描述
接下来的源码分析可以结合这个一起看。

getNode的所有情况
在这里插入图片描述

源码分析

	/**
     * 实现Map接口的get方法和相似功能
     *
     * 形参hash是key的hash
     * 形参key就是key
     * 找到返回node对象,找不到返回null
     */
    final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
        //成员变量table不为空 且 table的长度大于0 且 经哈希函数计算得到的存储单元不为空
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
            //1.1第一个节点
            //第一个节点的哈希值等于hash 且 第一个节点的key等于key
            if (first.hash == hash && 
                ((k = first.key) == key || (key != null && key.equals(k))))
                //返回第一个节点
                return first;
            //该存储单元链接了多个节点
            if ((e = first.next) != null) {
            	//1.2节点以红黑树的方式链接
            	//第一个节点的类型是树节点类型
                if (first instanceof TreeNode)
                	//调用专门在红黑树中查找的方法
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                //1.3节点以链表的方式链接
                //以循环的方式在该链表中查找
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        return e;
                } while ((e = e.next) != null);
            }
        }
        //2.找不到,返回null
        return null;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值