问题描述
- 请教HashMap源码中的一些问题
- final Entry getEntry(Object key) {
// 获取哈希值
// HashMap将“key为null”的元素存储在table[0]位置,“key不为null”的则调用hash()计算哈希值
int hash = (key == null) ? 0 : hash(key.hashCode());
// 在“该hash值对应的链表”上查找“键值等于key”的元素
for (Entry e = table[indexFor(hash table.length)];
e != null;
e = e.next) {
Object k;
if (**e.hash == hash **&&
((k = e.key) == key || (key != null&& key.equals(k))))
return e;
}
return null;
}
getEntry()函数中: 为啥要判断hash值是否相等,是因为key相等,hash值不一定相等吗?public boolean containsValue(Object value) {
// 若“value为null”,则调用containsNullValue()查找
if (value == null)
return containsNullValue();// 若“value不为null”,则查找HashMap中是否有值为value的节点。**Entry[] tab = table;**for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true;return false;
}
containsValue()中:Entry[] tab = table 为什么要创建一个新的tab引用指向原table,为什么不对table操作呢?
请教各位~
解决方案
hash的优势就在这里,hash相等,不一定值相等,但是hash不等,值一定不相等,基于此,先判断hash,可以加快搜索的速度。
Entry[] tab = table; 这里传的是引用,只是定义了一个类型而已,没有调用new,没有创建新的 tab。这么写只是使得下面需要写table的地方少写3个字母,没有性能的损失,也不是必须的。
时间: 2024-10-03 05:03:39