containsKey HashMap<>的实现 - Java

时间:2011-09-14 13:01:38

标签: java collections hashmap

使用containsKey()的全部目的是检查任何给定的键是否已经在HashMap中?如果它不包含该键而不仅仅是将键添加到HasMap中。

  

但似乎当我们调用此方法时,它的参数是Object   type,表示containsKey()检查给定的参数(key)是否有   类似的内存地址与任何其他已输入的密钥。

潜在解决方案:

  

一个解决方案是从该object1(oldKey)获取唯一数据   用object2(新密钥)检查,如果它们相同,则不要使用它   HashMap中。但是这意味着containsKey完全没有任何意义。我   正确?

对不起我没有咆哮,或者说我听起来像是一个人。但我想知道解决这个问题的最有效方法。

将会感谢任何帮助。

4 个答案:

答案 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()方法,那么从一开始就是一个糟糕的设计。