justblues 2015-06-11 09:03 采纳率: 0%
浏览 1578
已采纳

请教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操作呢?
请教各位~

  • 写回答

1条回答 默认 最新

  • threenewbee 2015-06-11 14:47
    关注

    hash的优势就在这里,hash相等,不一定值相等,但是hash不等,值一定不相等,基于此,先判断hash,可以加快搜索的速度。
    Entry[] tab = table; 这里传的是引用,只是定义了一个类型而已,没有调用new,没有创建新的 tab。这么写只是使得下面需要写table的地方少写3个字母,没有性能的损失,也不是必须的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制