2011-09-14 32 views
0

使用containsKey()的全部目的是檢查是否有任何給定的鍵已經存在於HashMap中?如果它不包含該鍵,則只需將該鍵添加到該HasMap中即可。containsKeyHashMap <>的實現 - Java

,但似乎當我們調用這個方法它的參數是對象 類型,這意味着,的containsKey()檢查給定的參數(密鑰)是否與任何其它已進入關鍵 類似的內存地址等。

潛在的解決方案:

一種解決方案可以從object1(oldKey)和 檢查與對象2(新密鑰)獲得唯一的數據,如果它們是相同的比不使用它 HashMap。但是這意味着containsKey根本沒有用處。我是 對不對?

對不起,我不是咆哮,或者我聽起來像一個。但我想知道解決這個問題的最有效的方法。

將感謝任何形式的幫助。

+3

你的問題目前沒有多少意義。你說什麼問題,你想達到什麼目的,「如果不是不加」,從哪裏來? –

+0

我不明白你的推理。 「對象類型」如何暗示它檢查「類似的內存地址」? –

+0

你不應該考慮Java中的內存地址。相反,想想參考。並請解釋問題所在。 –

回答

4

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

錯誤。首先比較它們的平均值,然後比較其值。只有散列值相等時,對象本身才可以進行比較(但始終使用equals()而不是==)。所以這兩種方法正確實現的任何類都可以正常工作,作爲HashMap中的一個鍵。

+0

抱歉模糊寫的問題,但你的答案肯定有幫助,謝謝! – doNotCheckMyBlog

+0

奇怪的是什麼將比較點之外的hashCode是?如果hashCodes做比賽,我們不能保證該數據將同樣是平等的嗎?我想也許還有人在那裏重寫的hashCode功能,請給我的地址,所以我可以在約面帶橡皮雞揍他們! –

1

,但似乎當我們調用這個方法它的參數是對象 型

是一樣的,但該方法將被稱爲實際實現類型,而不是Object.class。這就是爲什麼正確實現hashCode()非常重要。

閱讀:Effective java, Item 9(其實你應該購買和閱讀整本書)

2

HashMap.containsKey()方法,如果發現是否關鍵的hashCode()存在,而不是平等的比較。如果哈希碼存在,它將拉入該條目以查看該關鍵字的引用相等OR 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; 
    } 
0

,但似乎當我們調用這個方法就好像參數是對象類型,這意味着,的containsKey()檢查是否給定的參數(密鑰)也有類似的內存地址與其他已經進入關鍵

這個結論是錯誤的。containskey(Object key)在傳遞的鍵上調用equals()方法,因此如果這覆蓋了equals(Object key)方法,則它將根據關鍵等價條件正確解析。當然,如果密鑰沒有覆蓋equals()方法,那麼開始時就不好設計。

+0

不,它調用' hashCode'首先(在那之後,*有時*'equals')。 –

相關問題