我不理解这段代码,将新元素插入数组(哈希表) 我知道如果它是空的,那么我们添加新元素,然后返回null(因为之前,值为null)。
但我在(e != null && !e.key.equals(c))
时并不理解,这意味着虽然它不是空的,而且键不等于我们要添加的键?它不应该是相等的,因为我们使用indiHash(c)
来查找我们添加新元素的数组中的位置,所以如果在同一个存储桶中它们应该具有相同的键:然后我们转到下一个,这意味着我们要在桶列表的完整末尾添加该元素?我也不明白
valuebefore = e.valor;
e.valor = v;
我们回来了什么?在我们添加新的元素之前,存储桶列表中最后一个元素的值?
我不明白怎么会有if (e != null)
因为就在之前,在while循环中,我们确保当我们离开循环时e
为空
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;
}
答案 0 :(得分:3)
许多不同的对象可以具有相同的哈希码。即使它们没有相同的数组,由于数组的长度远小于2 ^ 32(不同的可能哈希码的数量),具有不同哈希码的对象最终会在同一个桶中。
所以最终在同一个桶中的对象存储在一个链接的条目列表中。上面的代码尝试在此链表中查找具有等于插入键的键的条目。如果找不到,则会创建一个新条目并将其添加到链接列表中。否则,与找到的条目关联的值将替换为新值。