HashMap中get(Object key)方法实现
2016-04-22 21:15
507 查看
jdk1.8
HashMap.java中获取指定关键字对应的值value方法get(Object key)
(n - 1) & hash得到hash槽的索引,获取该槽内的第一个Node, 先判断第一个Node的关键字是否符合key,若符合则返回
如果不符合,继续判断此Node是否是TreeNode类型,如果是,按树遍历的方式去查找关键字;
如果不是,按链表的方式继续向下遍历
如果没找到符合的,返回null。
红黑树查找关键字的遍历方法
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; }
相关文章推荐
- Objective-C Json格式数据解析
- Objective-C 借助第三方库解析XML格式数据
- Swift中与Objective-C的区别 -> 值类型和引用类型
- iOS学习笔记72-Objective-C Autorelease Pool 的实现原理
- Object-C 基础学习(一)
- ./zabbix_server: error while loading shared libraries: libiconv.so.2: cannot open shared object file
- android setTag (int key, Object tag)抛出IllegalArgumentException的问题
- TypeError: object of type 'NoneType' has no len()
- 走进Scala——伴生对象(Companion Object)
- Object窥探
- [转] Objective-C中的@property和@synthesize用法
- Object-c 编程之道 IOS设计模式解析
- 深入理解Objective-C:Category(下)
- ES6-Object的变化
- 深入理解Objective-C:Category(上)
- JAVA----Object类
- Hide Objects in Congos Connection
- Object-C 获取对象的属性和值
- Object.prototype.constructor
- objective-c 属性修饰符