一、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
取数据
返回: 没有对应的哈希映射,返回null,有哈希映射,返回 value
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。