为什么HashMap<Long, MYChainInformation>调用get(0)返回null,而get(0L)能获取到元素?
为什么HashMap<Long, MYChainInformation>调用get(0)返回null,而get(0L)能获取到元素?
这个问题的核心其实是Java的自动装箱机制+HashMap键的匹配规则在搞鬼,咱们一步步拆解开说:
首先,你的HashMap定义是HashMap<Long, MYChainInformation>,也就是说它的键类型是Long包装类。
当你调用get(0)的时候,这里的0是int基本类型,Java会自动把它装箱成Integer对象;而调用get(0L)的时候,0L是long基本类型,会自动装箱成Long对象。
接下来就是关键了:HashMap查找元素是依赖键的equals()方法和hashCode()方法的,只有当两个键的hashCode相等,并且equals()返回true的时候,才会认为是同一个键。
但Integer和Long是完全不同的类型,它们的equals()方法做了类型校验——只有当传入的对象也是同类型时才会比较值,否则直接返回false。比如你跑这段代码:
System.out.println(new Integer(0).equals(new Long(0L))); // 输出false
哪怕它们的哈希值碰巧相同(比如0的Integer和Long哈希值都是0),但equals()不通过,HashMap就找不到对应的元素,自然返回null。而get(0L)传入的是Long类型的键,和你HashMap里存储的键类型一致,值也匹配,所以能正常拿到对应的MYChainInformation对象。
简单总结就是:你存的是Long键,就得用Long类型的键去查,用Integer类型的键(哪怕值看起来一样)是匹配不上的。
备注:内容来源于stack exchange,提问作者DanialAbdi
相关产品推荐
相关产品推荐

