Hashmap查找返回null

时间:2017-04-25 20:44:10

标签: java nullpointerexception hashmap

为什么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

1 个答案:

答案 0 :(得分:2)

HashMap查找不会使用Arrays.equals,而只是普通.equals,这对于两个数组都会失败。

这就是为什么你基本上不能使用数组作为映射键的原因;你必须将它们包装在一个.equals实现的类中。