为什么hashmap查找失败? 我正在克隆此代码中的密钥以模拟从第二个来源接收密钥的副本。 key和key2都是相同的字节数组。
从注释掉的部分,可以验证哈希映射确实包含该值。那为什么查找会失败?
public class NewClass {
public static void main(String[] args) {
HashMap<byte [], String> lookupTable = new HashMap<>();
byte[] key = new byte[32], key2;
SecureRandom sr = new SecureRandom();
sr.nextBytes(key);
String value = Arrays.toString(key);
lookupTable.put(key, value);
key2 = key.clone();
//System.out.println(Arrays.toString(key));
//System.out.println(Arrays.toString(key2));
System.out.println("Keys equal: "+ Arrays.equals(key2, key));
String retrivedValue;
/*
Set<byte[]> keySet = lookupTable.keySet();
for(byte[] k :keySet ){
System.out.println("key in map : "+ Arrays.toString(k));
retrivedValue = keyLookupTable.get(k);
System.out.println("Test lookup sucessful:"+retrivedValue.equals(value));
}
*/
retrivedValue = lookupTable.get(key2);
try {
System.out.println("Test lookup sucessful:" + retrivedValue.equals(value));
} catch (NullPointerException e) {
System.out.println("retrivedValue is "+retrivedValue);
}
}
}
输出:
Keys equal: true
retrivedValue is null
答案 0 :(得分:2)
HashMap
查找不会使用Arrays.equals
,而只是普通.equals
,这对于两个数组都会失败。
这就是为什么你基本上不能使用数组作为映射键的原因;你必须将它们包装在一个.equals
实现的类中。