Java 带有字节数组键和字符串值的HashMap-containsKey()函数不';行不通

Java 带有字节数组键和字符串值的HashMap-containsKey()函数不';行不通,java,android,list,hashmap,containskey,Java,Android,List,Hashmap,Containskey,我使用的是HashMap:byte[]键和字符串值。但我意识到,即使我使用 在HashMap中,表仍然会插入一个具有不同HashMapEntry的新对象。那么函数containsKey()就不能工作了 有人能给我解释一下吗?我怎样才能解决这个问题?谢谢(Android Java) @覆盖公共布尔容器密钥(对象密钥){ if(key==null){ return entryForNullKey!=null; } int hash=Collections.secondaryHash(key); Ha

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

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

有人能给我解释一下吗?我怎样才能解决这个问题?谢谢(Android Java)

@覆盖公共布尔容器密钥(对象密钥){
if(key==null){
return entryForNullKey!=null;
}
int hash=Collections.secondaryHash(key);
HashMapEntry[]选项卡=表格;
对于(HashMapEntry e=tab[hash&(tab.length-1)];
e!=null;e=e.next){
K eKey=e.key;
如果(eKey==key | |(e.hash==hash&&key.equals(eKey))){
返回true;
}
}
返回false;
}
A
byte[]
(或任何数组)不能作为
HashMap
中的键正常工作,因为数组不会覆盖
equals
,因此两个数组只有在引用同一对象时才会被视为相等


你必须将你的
字节[]
包装在一些覆盖
hashCode
equals
的自定义类中,并使用该自定义类作为HashMap的键。

添加到Eran的明确答案中,因为字节[]或任何数组都不会覆盖hashCode和equals(它使用对象类的默认方法),您可以始终围绕以byte[]为构造函数参数的字符串对象。字符串不仅在映射中形成良好的键,而且它们也是不可变的(基于哈希的映射中的操作更快)


注意:这是一种非常老练的方法,可以在不重写equals()或hashCode()方法的情况下,将数组或字符串作为HashMap中的键。 我将以一种通用的方式给出答案,这样读者就可以得到想法,并根据他们的需求实施

比如说,我有两个数字,
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);
unmodifiable
部分(不深入讨论)确保密钥无法更改哈希代码

现在,
map.containsKey(key)
将为真


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

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

参考以下人士的答覆—

@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;
}
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));