使用containsKey()的全部目的是检查任何给定的键是否已经在HashMap中?如果它不包含该键而不仅仅是将键添加到HasMap中。
但似乎当我们调用此方法时,它的参数是Object type,表示containsKey()检查给定的参数(key)是否有 类似的内存地址与任何其他已输入的密钥。
潜在解决方案:
一个解决方案是从该object1(oldKey)获取唯一数据 用object2(新密钥)检查,如果它们相同,则不要使用它 HashMap中。但是这意味着containsKey完全没有任何意义。我 正确?
对不起我没有咆哮,或者说我听起来像是一个人。但我想知道解决这个问题的最有效方法。
将会感谢任何帮助。
答案 0 :(得分:4)
但是当我们调用这个方法时,它的参数是Object类型,这意味着,containsKey()检查给定的参数(key)是否与任何其他已经输入的键具有相似的内存地址。
错误。通过首先比较它们的hashCode()
值来检查它们的相等性。只有当哈希值相等时,才可以比较对象本身(但始终使用equals()
,而不是==
)。因此,正确实现这两种方法的任何类都可以正确地作为HashMap
中的键。
答案 1 :(得分:2)
HashMap.containsKey()
方法查找密钥的hashCode()
是否存在,而不是通过相等比较。如果存在哈希码,它将拉入该条目以查看密钥的引用相等或equals()
是否相等。
这是在HashMap.getEntry()
方法中实现的:
/**
* Returns the entry associated with the specified key in the
* HashMap. Returns null if the HashMap contains no mapping
* for the key.
*/
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
答案 2 :(得分:1)
但似乎当我们调用此方法时,它的参数是Object 型
是的,但是方法将在实际的实现类型上调用,而不是在Object.class上调用。这就是正确实现hashCode()非常重要的原因。
阅读:Effective java, Item 9(事实上你应该购买并阅读整本书)
答案 3 :(得分:0)
但似乎当我们调用此方法时,它的参数是Object类型,这意味着,containsKey()检查给定的参数(key)是否具有与任何其他已输入的键类似的内存地址
这个结论是错误的。 containskey(Object key)
在传递的密钥上调用equals()
方法,因此如果这已覆盖equals(Object key)
方法,则它将根据密钥等效条件正确解析。当然,如果Key没有覆盖equals()
方法,那么从一开始就是一个糟糕的设计。