今天同事向我抱怨了一个他最近使用hashmap时遇到的一个诡异问题,他的代码逻辑大概如下:

Map<Long, String> map = new HashMap<>();
map.put(70l, "dd");
System.out.println(map.get(70));

输出结果是什么?他预期的是“dd”,  但是实际是null, 对于java的初学者来说这确实是一个很奇怪的现象,明明就存进去了!

先来看看java中hashmap的存储和读取过程是什么样的,网上有很多文章介绍,比如: https://www.cnblogs.com/chenssy/p/3521565.html

put方法的过程概括如下:

  1. 依据key的hashcode方法得到的int值找到对应的桶
  2. 在桶后其实是一个链表存储,遍历这个链表,如果没有相同的key存在,则放到当前链表的最前面

get方法的过程概括如下:

  1. 依据key的hashcode方法得到的int值找到对应的桶
  2. 同样也是在这个通中的链表里找,但是使用的是equals方法来寻找是否存在这个key, 如果存在则返回对应的value,如果没找到,就返回null

了解了上面的过程,不难看出代码里的问题,它传的是Integer类型的数值,而map中的key都是Long类型, 两种不同类型key的equals肯定是返回false, 自然最后的结果就是null了

那应该如何修改呢?只需要在70后面加上一个l的后缀就可以了。

Map<Long, String> map = new HashMap<>();
map.put(70l, "dd");
System.out.println(map.get(70l));

运行代码后,果然输出了“dd”.

 

欢迎关注我的个人的博客www.zhijianliu.cn, 虚心求教,有错误还请指正轻拍,谢谢

版权声明:本文出自志健的原创文章,未经博主允许不得转载

发表评论

电子邮件地址不会被公开。