首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈希表插入

哈希表插入
EN

Stack Overflow用户
提问于 2015-04-19 01:51:05
回答 1查看 758关注 0票数 1

我不理解这段代码,为了向数组(哈希表)插入一个新元素,我知道如果它是空的,那么我们添加新元素,然后返回null (因为以前,值是null)。

但我不明白while (e != null && !e.key.equals(c)),意思是说,虽然它不是空的,但是键不等于我们想要添加的键?它不是应该相等吗,因为我们使用indiHash(c)在数组中找到添加新元素的位置,所以如果在同一存储桶中,它们应该具有相同的键:然后我们转到下一个,这意味着我们将在存储桶列表的完整末尾添加该元素。我也不明白

代码语言:javascript
复制
valuebefore = e.valor;
e.valor = v;

我们返回的是什么?在添加新元素之前,存储桶列表中最后一个元素的值是什么?

我不明白为什么会有if (e != null),因为在前面的while循环中,当我们离开循环时,我们确保e为null

代码语言:javascript
复制
public V insert(C c, V v) {

    V valuebefore = null;
    int position = indiHash(c);
    EntryHash<C, V> e = Array[pos];

    while (e != null && !e.key.equals(c))
        e = e.next;

    if (e == null) { 
        Array[position] = new EntryHash<C,V>(c, v, Array[position]);
        size++;
    } else { // 
        valuebefore = e.valor;
        e.valor = v;
    }
    return valuebefore;
}
EN

回答 1

Stack Overflow用户

发布于 2015-04-19 02:03:29

许多不同的对象可以有相同的哈希码。即使它们没有相同的散列码,因为数组的长度比2^32 (不同可能的散列码的数量)短得多,具有不同散列码的对象最终会出现在同一个存储桶中。

因此,最终在同一存储桶中的对象被存储在条目的链接列表中。上面的代码试图在这个链表中查找一个键值等于插入的键值的条目。如果没有找到,则创建一个新条目并将其添加到链表中。否则,与找到的条目相关联的值将被新值替换。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29720771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档