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