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个字母,没有性能的损失,也不是必须的。

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

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?