簡體   English   中英

帶有字節數組鍵和字符串值的 HashMap - containsKey() 函數不起作用

[英]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[]包裝在一些覆蓋hashCodeequals自定義類中,並使用該自定義類作為 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() 方法。 我將以通用方式包含答案,以便讀者可以根據他們的要求獲得想法並實施。

說,我有兩個數字, nr 我想要一個鍵值對,其中[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[] 數組的包裝器。

參考答案 - https://stackoverflow.com/a/14087243/4019660

暫無
暫無

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

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