我有一个hashMap的实现。当调用get()函数时,它返回输入键的关联值(如果存在),遍历映射以查看它是否可以找到具有与输入等效的键的条目,并且还共享相同的哈希码。如果是,则返回相关值。
我了解到错误发生在从我的put(Object K,Object V)函数分支的辅助方法中。
public V put(K key, V value) {
System.out.print("KEY at PUT IS " + key);
if (key == null) {
...
return null;
}
int hash = key.hashCode();
int bucket = hash(hash, table.length);
System.out.println("Key is " + key + "bucket is " + bucket + "hash is " + hash);
...
add(hash, key, value, bucket);
return null;
}
辅助功能的相关部分如下。
private void add(int hash, K key, V val, int bucket) {
Entry<K, V> e = table[bucket];
System.out.println("table[bucket] before adding a value is " + table[bucket]);
System.out.println("key in ADD is " + key + "HASH in ADD " + hash);
table[bucket] = new Entry<K, V>(key, val, e);
size++;
System.out.println(" table[bucket] is now " + table[bucket].key + " table[bucket] hash is now" + table[bucket].hashCode());
...
}
现在,如果我创建一个新的hashMap,x,并调用x.put(“foo”,2);打印以下内容。
PUTTING 2
...
(we reach the add function)
table[bucket] before adding a value is null
Key in ADD is foo, HASH in ADD 101574
table[bucket] is now foo, table[bucket] hash is now 3149757
我的假设是它与我输入新条目的方式有关。但是,新条目只是使用键,值和“下一个”项进行实例化。因此,经过长时间的调试后,我无法理解hashCode是如何从101574更改为3149757的。
我读了这个问题,看看插入数据可以改变以前的hashCode。
when add key-value pair to a hashMap, why Java makes hashMap's hashCode change?
但是,我已经看到了几个实现这似乎不是问题的实现。 这个hashCode应该保持不变吗?