假设您有一个键类(KeyClass),其中包括重写的equals、hashCode和clone方法。假设它有两个原始字段,一个字符串(name)和一个整数(id)。
现在您定义:
现在
我理解在将键放入映射中后,即使我改变了该键,原始键仍然保留。但是,即使保留了原始键引用,仍然可以更改其内容。因此,如果更改了内容并且K,V仍存储在原始位置,则如何进行检索? 编辑 如果在将键放入哈希表后更改键,则检索将失败。因此,不建议使用具有可变哈希表键。
现在您定义:
KeyClass keyOriginal, keyCopy, keyClone;
keyOriginal = new KeyClass("original", 1);
keyCopy = new KeyClass("original", 1);
keyClone = KeyClass.clone();
现在
keyOriginal.hashCode() == keyCopy.hashCode() == keyClone.hashCode()
keyOriginal.equals(keyCopy) == true
keyCopy.equals(keyClone) == true
就HashMap而言,keyOriginal、keyCopy和keyClone是无法区分的。
如果你使用keyOriginal向HashMap中添加一个条目,你可以使用keyCopy或keyClone来检索它,也就是说
map.put(keyOriginal, valueOriginal);
map.get(keyCopy) will return valueOriginal
map.get(keyClone) will return valueOriginal
另外,如果你在将键放入映射之后改变了它,就无法检索到原始值。举个例子:
keyOriginal.name = "mutated";
keyOriginal.id = 1000;
Now map.get(keyOriginal) will return null
那么我的问题是
当你使用map.keySet()时,它将返回映射中所有键。HashMap类如何知道映射中所存储的所有键、值和条目的完整列表呢?
编辑 据我所知,它通过将Entry键作为一个final变量来实现。
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
我理解在将键放入映射中后,即使我改变了该键,原始键仍然保留。但是,即使保留了原始键引用,仍然可以更改其内容。因此,如果更改了内容并且K,V仍存储在原始位置,则如何进行检索? 编辑 如果在将键放入哈希表后更改键,则检索将失败。因此,不建议使用具有可变哈希表键。