我不理解这段代码,为了向数组(哈希表)插入一个新元素,我知道如果它是空的,那么我们添加新元素,然后返回null (因为以前,值是null)。
但我不明白while (e != null && !e.key.equals(c)),意思是说,虽然它不是空的,但是键不等于我们想要添加的键?它不是应该相等吗,因为我们使用indiHash(c)在数组中找到添加新元素的位置,所以如果在同一存储桶中,它们应该具有相同的键:然后我们转到下一个,这意味着我们将在存储桶列表的完整末尾添加该元素。我也不明白
valuebefore = e.valor;
e.valor = v;我们返回的是什么?在添加新元素之前,存储桶列表中最后一个元素的值是什么?
我不明白为什么会有if (e != null),因为在前面的while循环中,当我们离开循环时,我们确保e为null
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;
}发布于 2015-04-19 02:03:29
许多不同的对象可以有相同的哈希码。即使它们没有相同的散列码,因为数组的长度比2^32 (不同可能的散列码的数量)短得多,具有不同散列码的对象最终会出现在同一个存储桶中。
因此,最终在同一存储桶中的对象被存储在条目的链接列表中。上面的代码试图在这个链表中查找一个键值等于插入的键值的条目。如果没有找到,则创建一个新条目并将其添加到链表中。否则,与找到的条目相关联的值将被新值替换。
https://stackoverflow.com/questions/29720771
复制相似问题