Java 哈希表插入

Java 哈希表插入,java,hash,Java,Hash,我不理解这段代码,在数组(哈希表)中插入新元素 我知道如果它是空的,那么我们添加新元素,并返回null(因为之前,值是null) 但是我不明白当(e!=null&&!e.key.equals(c))时,它意味着当它不为null且密钥不等于我们要添加的密钥时?它不是应该相等吗,因为我们使用indiHash(c)来查找数组中添加新元素的位置,所以如果在同一个bucket中有相同的键,那么它们应该具有相同的键:然后我们转到下一个,这意味着我们要将该元素添加到bucket列表的完整末尾?我也不明白 va

我不理解这段代码,在数组(哈希表)中插入新元素 我知道如果它是空的,那么我们添加新元素,并返回null(因为之前,值是null)

但是我不明白当
(e!=null&&!e.key.equals(c))
时,它意味着当它不为null且密钥不等于我们要添加的密钥时?它不是应该相等吗,因为我们使用
indiHash(c)
来查找数组中添加新元素的位置,所以如果在同一个bucket中有相同的键,那么它们应该具有相同的键:然后我们转到下一个,这意味着我们要将该元素添加到bucket列表的完整末尾?我也不明白

valuebefore = e.valor;
e.valor = v;
我们回来干什么?在添加新元素之前,存储桶列表中最后一个元素的值是多少

我不明白如果(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;
}
public V insert(C-C,V-V){
V valuebefore=null;
int position=indiHash(c);
EntryHash e=数组[pos];
而(e!=null&!e.key.equals(c))
e=e.next;
如果(e==null){
Array[position]=新的EntryHash(c,v,Array[position]);
大小++;
}else{//
valuebefore=e.valor;
e、 英勇=v;
}
返回之前的值;
}

许多不同的对象可以具有相同的哈希代码。即使它们没有相同的哈希代码,由于数组的长度远小于2^32(可能的不同哈希代码的数量),具有不同哈希代码的对象最终也会在同一个bucket中


因此,在同一个bucket中结束的对象存储在条目的链接列表中。上面的代码试图在此链表中找到一个项,该项的键等于插入的键。如果没有找到任何条目,将创建一个新条目并添加到链接列表中。否则,与找到的条目关联的值将被新值替换。

但是while(e!=null&&!e.key.equals(c))的字面意思是什么?当e为“空”且c与e的键不同时,它将在linkedlist中查找下一个元素?我认为在特定的linkedlist上,它们都有相同的密钥,因为它们都有相同的哈希代码,这就是为什么它们在同一个数组中的原因。它的字面意思是“继续循环,而e不为null,e中的密钥不同于c”。或者,如果您愿意,“只要e为null,或者e中的键等于c,就停止循环”。不,正如我的回答所解释的,你认为是错的。假设键是整数,数组的大小是15。0将0作为哈希代码。0模15将是铲斗索引。所以它将进入0桶。30将有30作为哈希代码。30模15将是铲斗索引。因此,它也将进入bucket 0,即使它没有与0相同的hashCode,并且不等于0.So valuebefore=e.valor;e、 英勇=v;在e不为空且e中的键等于c的情况下执行?为什么他们执行e.valor=v?重点是什么?重点是用新值替换旧值。这就是该方法的全部要点:在映射中插入值后,您希望该值位于映射中。但我们是否将其添加到linkedlist的末尾?在我们添加新值之前返回最后一个值有什么意义?