Java中能否用int[]作为Map的键?为何用其做键取值失败?
为什么int[]作为HashMap键无法正确取值,而List可以?
- HashMap判断键是否相等的核心逻辑:必须满足两个条件——两个键的
hashCode()返回值相同,且调用equals()方法返回true。 - int[]的
hashCode()和equals()是基于对象身份的:Java里数组属于对象,但它直接继承了Object类的这两个方法。Object的hashCode()返回的是和对象内存地址绑定的值,equals()则是直接比较对象的引用是否指向同一块内存。也就是说,哪怕两个int[]的元素完全一样,只要是用new创建的不同对象,HashMap就会把它们当成完全不同的键。 - List
的 hashCode()和equals()是基于内容的:像ArrayList这类常用List实现,重写了这两个方法——计算hashCode时会遍历所有元素累加哈希值,equals时会逐个比较元素的内容和顺序。只要两个List的元素内容、顺序完全一致,就会被HashMap判定为同一个键。
拿你的代码举例:
你用prefixSum.put(new int[]{i,j}, sum)存入的是一个新的数组对象,之后调用prefixSum.get(new int[]{0,0})时,又新建了另一个数组对象。这两个对象虽然内容一样,但引用不同,HashMap认不出它们是同一个键,所以返回null。而换成List
内容的提问来源于stack exchange,提问作者Chiguire
相关产品推荐
相关产品推荐

