【发布时间】:2013-10-22 07:54:34
【问题描述】:
请参考以下代码:
public static void main (String[] args) {
Map<Number, String> map = new HashMap<Number, String>();
map.put(1L, "test");
System.out.println(map.get(1));
}
为什么 HashMap.get 返回 null? O_o hashCode函数返回1的任何对象都必须返回值,不是吗?
更新
问题是 Map 接口接收 Object,而不是参数化类型。所以我原以为任何对象都可以是key,但是HashMap实现用equals检查类型,这让我很吃惊。
自动装箱不是问题。我知道,那个 1 变成了 Integer,而 1L 变成了 Long。但它们有相同的哈希码。所以我认为任何实现 Map#get 都应该为具有 same 哈希码的任何对象返回值。
【问题讨论】:
-
试试
System.out.println(map.get(1L)); -
你说得对,整数 1 和长 1L 具有相同的哈希码,并且将存储在地图内的同一个桶中。但随后
.equals完成并返回 false。