2017-08-08 14 views
0

假設我有一個HashMap M。我想在這個HashMap上調用「get」函數,並找到與給定對象S關聯的值。但我沒有實際參考對象S,因此我創建了一個新對象S_new,其內容與S的內容相同。如果我撥打M.get(S_new),是否會給我提供與密鑰S相關的價值?java.util.HashMap get:key必須與存儲在HashMap中的對象完全相同,或者密鑰可以「相等」

+0

絕對沒有,它們不是同一個實例。 – Euclides

+2

簡短的答案 - 如果對象相同且具有相同的hashCode值,它將正常工作。 – udalmik

+0

如果他們散列相同 - 是的。如果不是 - 不。應該避免嗎? - 絕對是 –

回答

4

the documentation for Map#get

public V get(Object key)

返回指定的鍵映射到的值;如果此映射不包含鍵映射,則返回null。更正式地說,如果該映射 包含從密鑰k到值爲v1的映射,使得(key==null ? k==null : key.equals(k)),則該方法返回v;否則它會返回null。 (可以有至多一個這樣的映射。)

所以只要參數你傳遞覆蓋equals以這樣的方式,地圖鍵被看作是等同的,你可以使用不同的實例,以檢索來自地圖的值。

此外,正如@Eugene和其他人提到的,對於HashMap,您還必須覆蓋hashCode方法,並確保您的實例返回與您的密鑰相同的值。一般來說,最佳做法是確保您的平等執行是對稱(即A.equals(B) < ==>B.equals(A)),並且相等的值應具有相同的hashCode

+0

在一個基於散列的映射或集合中,'hashCode'也必須被覆蓋或等於永遠不會被測試。 –

+0

OP要求'HashMap',所以重要的是要有一個匹配的'hashCode()'方法。 –

+0

@KevinKrumwiede - 是的,好點,這是準確的。 – nbrooks

3

是的,只要hashcodeequals會產生相同的確切值。還要注意的是get甚至不要求的參數是T - 這是Object,所以any類型將履行的哈希碼,等於將工作

+0

在實踐中,任何其他類型都可以兼容地實現equals和hashCode是不太可能的也是不可能的。請參閱[此答案](https://stackoverflow.com/a/18575969/1953590)。 –

+0

@KevinKrumwiede我同意。我還沒有看到一個情況,除了'T'之外的東西從邏輯意義上來說可以從'Map'獲得;仍然這是由規範允許的... – Eugene

0

否從地圖使用鍵獲取值並不意味着該鍵應該是放置時使用的同一對象。

唯一的問題是,哈希碼&等於應該是相同的,這就是它強制重寫哈希碼&等於方法的原因,如果你想使用自己的類對象作爲關鍵。

相關問題