簡體   English   中英

containsKey HashMap <>的實現-Java

[英]Implementation of containsKey HashMap<> - Java

使用containsKey()的整個目的是檢查HashMap中是否已存在任何給定的鍵? 如果不包含該鍵,則只需將鍵添加到該HasMap中即可。

但是似乎當我們調用此方法時,它的參數是對象類型,這意味着containsKey()檢查給定的parameter(key)是否具有與任何其他已經輸入的鍵相似的內存地址。

潛在的解決方案:

一種解決方案是從該object1(oldKey)獲取唯一數據,並與object2(new key)進行檢查,如果它們相同,則不要在HashMap中使用它。 但是,這意味着containsKey毫無用處。 我對嗎?

抱歉,我並不在意,或者聽起來像我。 但是我想知道解決這個問題的最有效方法。

感謝您提供的任何幫助。

但是似乎當我們調用此方法時,它的參數是對象類型,這意味着containsKey()檢查給定的parameter(key)是否具有與任何其他已經輸入的鍵相似的內存地址。

錯誤。 通過首先比較其hashCode()值來檢查其相等性。 僅當哈希值相等時,才可以比較對象本身(但始終使用equals() ,而不是== )。 因此,正確實現這兩種方法的任何類都可以作為HashMap的鍵正常工作。

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;
    }

但是似乎當我們調用此方法時,它的參數是對象類型

是的,但是該方法將在實際的實現類型上調用,而不是在Object.class上調用。 這就是為什么正確實現hashCode()如此重要的原因。

閱讀: 有效的Java,第9項 (實際上,您應該購買並閱讀整本書)

但是似乎當我們調用此方法時,它的參數是對象類型,這意味着,containsKey()檢查給定的argument(key)是否具有與任何其他已輸入鍵相似的內存地址

這個結論是錯誤的。 containskey(Object key)在傳遞的鍵上調用equals()方法,因此,如果此方法已覆蓋equals(Object key)方法,則它將根據鍵等效條件正確解析。 當然,如果Key尚未覆蓋equals()方法,那么從一開始就不好設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM