java - Hashmap 查找返回 null

标签 java nullpointerexception hashmap

为什么 HashMap 查找失败? 我在这段代码中克隆 Key 来模拟从第二个源接收 key 的副本。 key 和 key2 都是相同的字节数组。

从注释掉的部分可以验证 HashMap 确实包含该值。那么为什么查找失败呢?

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

最佳答案

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

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

关于java - Hashmap 查找返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43620599/

相关文章:

java - 从文本文件初始化对象数组

java - 没有明显代码错误的空指针异常错误

java - HashMap 获取一个元素并设置为自定义值类型

java - 使用三个类的 GUI 应用程序上的空指针异常

java - 用于在文本 Java 中搜索单词的最有效数据结构

java - 为什么 JTextArea 很小?

java - .pkr 和 .key 文件对于 PGP 有什么区别?

java - 发送到 scheduleAtFixedRate 时线程名称不匹配

google-app-engine - 具有 HashMap 子字段的 Google App Engine JDO 持久性

java - 泛型对执行时间的影响