HashMap中get(Object key)方法实现
来源:互联网 发布:天天向上 知乎 编辑:程序博客网 时间:2024/05/22 00:29
jdk1.8
HashMap.java中获取指定关键字对应的值value方法get(Object key)
(n - 1) & hash得到hash槽的索引,获取该槽内的第一个Node, 先判断第一个Node的关键字是否符合key,若符合则返回
如果不符合,继续判断此Node是否是TreeNode类型,如果是,按树遍历的方式去查找关键字;
如果不是,按链表的方式继续向下遍历
HashMap.java中获取指定关键字对应的值value方法get(Object key)
/* 返回指定关键字的值value,没有则返回null */ public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; } /** * 实现Map.get()及其相关方法 * @param hash hash for key * @param key the key * @return the node, or null if none */ 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 && // 始终检查第一个结点 ((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; }
(n - 1) & hash得到hash槽的索引,获取该槽内的第一个Node, 先判断第一个Node的关键字是否符合key,若符合则返回
如果不符合,继续判断此Node是否是TreeNode类型,如果是,按树遍历的方式去查找关键字;
如果不是,按链表的方式继续向下遍历
如果没找到符合的,返回null。
红黑树查找关键字的遍历方法
/** * 调用树的find()函数 */ final TreeNode<K,V> getTreeNode(int h, Object k) { return ((parent != null) ? root() : this).find(h, k, null); } /** * 从根节点p开始查找指定hash值和关键字key的结点 * 当第一次使用比较器比较关键字时,参数kc储存了关键字key的 比较器类别 */ final TreeNode<K,V> find(int h, Object k, Class<?> kc) { TreeNode<K,V> p = this; do { int ph, dir; K pk; TreeNode<K,V> pl = p.left, pr = p.right, q; if ((ph = p.hash) > h) //如果给定哈希值小于当前节点的哈希值,进入左节点 p = pl; else if (ph < h) //如果大于,进入右结点 p = pr; else if ((pk = p.key) == k || (k != null && k.equals(pk))) //如果哈希值相等,且关键字相等,则返回当前节点 return p; else if (pl == null) //如果左节点为空,则进入右结点 p = pr; else if (pr == null) //如果右结点为空,则进入左节点 p = pl; else if ((kc != null || (kc = comparableClassFor(k)) != null) && (dir = compareComparables(kc, k, pk)) != 0) //如果不按哈希值排序,而是按照比较器排序,则通过比较器返回值决定进入左右结点 p = (dir < 0) ? pl : pr; else if ((q = pr.find(h, k, kc)) != null) //如果在右结点中找到该关键字,直接返回 return q; else p = pl; //进入左节点 } while (p != null); return null; }
0 0
- HashMap中get(Object key)方法实现
- HashMap中的put(Object key, Object value)方法实现
- 为什么Java中的HashMap<K, V>的get函数是get(Object key),而不是get(K key)?
- HashMap中使用object做key的问题
- HashMap的put,get方法实现!
- HashMap中put与get的实现
- object-c中get/set方法
- HashMap 将object 当做key传入
- HashMap.put/get方法
- Object.hashCode() VS Map.get(key)
- HashMap与HashCode()、equals()的关系---在HashMap中实现以对象为键(key)
- HashMap与HashCode()、equals()的关系---在HashMap中实现以对象为键(key)
- HashMap中按key排序
- Java之HashMap get方法
- HashMap学习笔记:get方法
- HashMap中的get方法注意事项
- HashMap中实现原理及hashcode方法
- 遍历object中所有key
- 在QtOpenglWidget中使用原生函数写FBO时,应注意的
- js--DOM--3.DOM2和DOM3
- 素数探求
- 测试for,foreach和Iterator遍历效率
- 简单的CSS图片动画(鼠标悬浮效果)
- HashMap中get(Object key)方法实现
- COMSOL学习(一)
- HMAC-MD5
- 《全栈增长工程师指南》笔记1
- javascript要小心函数嵌套
- 基于Android平台的会议室管理系统详细设计说明书
- <form><textarea><label><fieldset><legend><optgroup><button>标签整理
- iOS总结html的表单属性用法!
- [Nginx日记](1)Nginx启动与关闭