【问题标题】:HashMap with byte array key and String value - containsKey() function doesn't work具有字节数组键和字符串值的 HashMap - containsKey() 函数不起作用
【发布时间】:2015-11-03 11:12:06
【问题描述】:

我正在使用 HashMap: byte[] 键和字符串值。但我意识到,即使我使用

放置相同的对象(相同的字节数组和相同的字符串值)
myList.put(TheSameByteArray, TheSameStringValue)

到HashMap中,表还是会插入一个新的具有不同HashMapEntry的对象。那么函数 containsKey() 就不能工作了。

有人可以为我解释一下吗?我怎样才能解决这个问题?谢谢。 (Android 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;
}

【问题讨论】:

    标签: java android list hashmap containskey


    【解决方案1】:

    byte[](或任何数组)不能作为HashMap 中的键正常工作,因为数组不会覆盖equals,因此只有当两个数组引用相同时才会被视为相等对象。

    您必须将您的byte[] 包装在某个覆盖hashCodeequals 的自定义类中,并使用该自定义类作为您的HashMap 的键。

    【讨论】:

      【解决方案2】:

      添加到 Eran 的明确答案,由于 byte[] 或任何数组都不会覆盖 hashcode 和 equals(它使用 Object 类的默认方法),你总是可以环绕一个 String 对象,它将 byte[] 作为构造函数参数。不是只有String在Map中形成好的键,它们也是不可变的(基于Hash的map中的操作更快)

      http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[])

      【讨论】:

        【解决方案3】:

        注意:这是在不覆盖 equals() 或 hashCode() 方法的情况下创建数组或字符串(HashMap 中的键)的一种非常 hack-y 的方法。 我将以通用的方式包含答案,以便读者可以了解想法并根据他们的要求实施。

        比如说,我有两个号码,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) 将是真的。

        注意:这不是一个好方法。这只是一种解决方法。

        【讨论】:

          【解决方案4】:

          您可以使用ByteBuffer,它是带有比较器的字节[] 数组的包装器。

          参考来自-https://stackoverflow.com/a/14087243/4019660的答案

          【讨论】:

            猜你喜欢
            • 2016-01-14
            • 1970-01-01
            • 2017-06-08
            • 2014-07-03
            • 1970-01-01
            • 2012-08-04
            • 1970-01-01
            • 2019-03-12
            • 1970-01-01
            相关资源
            最近更新 更多