【源码分析】HashMap(二)

一、HashMap

put
get
中判断是否找到该对象的映射关系的条件写法

e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k)))

理解:

先判断对象的 hash值 是否相等, hash值不相等
,说明不是同一个对象

hash 值相等
但不一定为同一个对象 ( hash 冲突

还需要进一步判断对象是否相等(key),以及它的内容是否一样

1. get方法

Map map = new HashMap();
map.put("o","lankeren");

map.get("o"); //lankeren

debug
进入 get 方法内部

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

进入hash方法,通过对象的hashCode算出hash值接着进入 getNode
方法

/**
    *     map.get
    **/ 
   final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
        // 如果table数组为空,或者该key的映射位置为null,直接return
        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))))
                        // 如果key相等,找到
                        return e;
                } while ((e = e.next) != null);
            }
        
        }
        return null;
    }

树结构 getTreeNode
先不研究

put / get 好像主要就是通过传入的 key / key-value 在方法内部的结构体Node — 全局变量 table数组的操作

table 通过 tab = table
, 将每个方法中 tab 的处理结果存到 table 中,以便下次继续 tab = table
数据

原文 

https://segmentfault.com/a/1190000021128772

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 【源码分析】HashMap(二)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址