[英]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.