Java Hashmap查找返回null
为什么hashmap查找失败? 我在这段代码中克隆密钥是为了模拟从第二个源接收密钥副本的过程。key和key2都是相同的字节数组 从注释掉的部分,可以验证哈希映射确实包含该值。那么为什么查找失败呢Java Hashmap查找返回null,java,nullpointerexception,hashmap,Java,Nullpointerexception,Hashmap,为什么hashmap查找失败? 我在这段代码中克隆密钥是为了模拟从第二个源接收密钥副本的过程。key和key2都是相同的字节数组 从注释掉的部分,可以验证哈希映射确实包含该值。那么为什么查找失败呢 public class NewClass { public static void main(String[] args) { HashMap<byte [], String> lookupTable = new 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);
}
}
}
HashMap
查找不会使用数组.equals
,而是使用普通的.equals
,这将导致两个数组失败
这就是为什么基本上不能使用数组作为映射键的原因;您必须使用
.equals
实现将它们包装在一个类中。HashMap
查找不会使用数组。equals
,而只是普通的.equals
,这将导致两个数组失败
这就是为什么基本上不能使用数组作为映射键的原因;您必须使用
.equals
实现将它们包装在一个类中。您需要直接比较hashCode和equals方法,看看它们是否匹配。这里还要深入研究克隆方法:在为程序工件(如retrievedvalue
)选择名称时,使用常规拼写来命名部件是一种很好的工程。它减少了在下游维护期间虫子潜入的机会。您需要直接比较hashCode和equals方法,看看它们是否匹配。这里还要深入研究克隆方法:在为程序工件(如retrievedvalue
)选择名称时,使用常规拼写来命名部件是一种很好的工程。它减少了在下游维护期间虫子潜入的机会。@Soumy,这个答案的要点是数组equals
实现使用从对象继承的身份比较,而不是值比较。这意味着,即使两个数组具有相同的内容,但只有当它们实际上是同一个数组时,它们才是相等的。因此,不,您正在搜索的数组不在映射的键集中。我从OP的帖子中猜测,因为他们在示例程序中使用了数组.equals
,所以他们理解对象.equals
对数组做了什么,但不理解maps是如何使用它们的。一种解决方法是用作键,因为ByteBuffer实现了一个比较其内容的equals方法。@Soumy,这个答案的要点是数组equals
实现使用从对象继承的身份比较,而不是值比较。这意味着,即使两个数组具有相同的内容,但只有当它们实际上是同一个数组时,它们才是相等的。因此,不,您正在搜索的数组不在映射的键集中。我从OP的帖子中猜测,因为他们在示例程序中使用了数组.equals
,所以他们理解对象.equals
对数组做了什么,但不了解maps是如何使用它们的。一个解决方法是用作键,因为ByteBuffer实现了一个比较其内容的equals方法。
Keys equal: true
retrivedValue is null