为什么整数键在HashMap中不起作用?

Che*_*rry 4 java hashmap hashcode

Cobnsider以下代码:

public static void main (String[] args) {
    Map<Number, String> map = new HashMap<Number, String>();
    map.put(1L, "test");
    System.out.println(map.get(1));
}
Run Code Online (Sandbox Code Playgroud)

为什么HashMap.get返回null?O_o它必须为hashCode函数返回1的任何对象返回值,不是吗?

更新

问题是Map接口接收Object,而不是参数化类型.所以我期望任何对象都可以是一个键,但HashMap实现检查类型与equals,这对我来说是令人惊讶的.

而自动装箱不是问题.我知道,1成为Integer,1L成为Long.但是它们具有相同的哈希码.因此我认为任何实现Map#get都应返回具有相同哈希码的任何Object的值.

Kay*_*man 6

你正在放一个1L(Long)的密钥并获得1(Integer)的密钥.

他们不是一回事,所以要小心.

从放置中移除L,或将L添加到get.或者甚至更好,不要把它们写成原语并依靠自动装箱.

  • 或者不要使用HashMap <Number,String>,而是使用HashMap <Long,String> (2认同)