![](/img/trans.png)
[英]ContainsKey of HashMap does not work with a Custom Class as key
[英]HashMap with byte array key and String value - containsKey() function doesn't work
我正在使用 HashMap: byte[] 鍵和字符串值。 但我意識到即使我使用相同的對象(相同的字節數組和相同的字符串值)
myList.put(TheSameByteArray, TheSameStringValue)
進入HashMap,表仍然插入一個不同HashMapEntry的新對象。 然后函數 containsKey() 無法工作。
有人可以為我解釋一下嗎? 我怎樣才能解決這個問題? 謝謝。 (安卓 Java)
@Override public boolean containsKey(Object key) {
if (key == null) {
return entryForNullKey != null;
}
int hash = Collections.secondaryHash(key);
HashMapEntry<K, V>[] tab = table;
for (HashMapEntry<K, V> e = tab[hash & (tab.length - 1)];
e != null; e = e.next) {
K eKey = e.key;
if (eKey == key || (e.hash == hash && key.equals(eKey))) {
return true;
}
}
return false;
}
byte[]
(或任何數組)不能作為HashMap
的鍵正常工作,因為數組不會覆蓋equals
,因此只有當兩個數組引用同一個對象時,它們才會被視為相等。
您必須將byte[]
包裝在一些覆蓋hashCode
和equals
自定義類中,並使用該自定義類作為 HashMap 的鍵。
添加到 Eran 的明確答案中,由於 byte[] 或任何數組不會覆蓋 hashcode 和 equals(它使用 Object 類的默認方法),你總是可以環繞一個 String 對象,它以 byte[] 作為構造函數參數。不僅 String在 Map 中形成好的鍵,它們也是不可變的(基於哈希的映射中的操作更快)
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[])
注意:這是一種制作數組或字符串、HashMap 中的鍵的非常hack-y 的方法,而無需覆蓋 equals() 或 hashCode() 方法。 我將以通用方式包含答案,以便讀者可以根據他們的要求獲得想法並實施。
說,我有兩個數字, n
和r
。 我想要一個鍵值對,其中[n,r]
作為鍵, (n+r)
作為值。
Map<List<Integer>, Integer> map = new HashMap<List<Integer>, Integer>();
List<Integer> key = Arrays.asList(n, r);
if( map.containsKey(key) )
return map.get(key);
如果地圖不包含密鑰怎么辦?
map.put(Collections.unmodifiableList(Arrays.asList(n, r)), (n+r));
unmodifiable
部分(無需深入研究)確保密鑰無法更改哈希碼。
現在, map.containsKey(key)
將為真。
注意:這不是一個好方法。 這只是一種解決方法。
您可以使用ByteBuffer
,它是帶有比較器的 byte[] 數組的包裝器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.