今天同事向我抱怨了一个他最近使用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方法的过程概括如下:
- 依据key的hashcode方法得到的int值找到对应的桶
- 在桶后其实是一个链表存储,遍历这个链表,如果没有相同的key存在,则放到当前链表的最前面
get方法的过程概括如下:
- 依据key的hashcode方法得到的int值找到对应的桶
- 同样也是在这个通中的链表里找,但是使用的是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, 虚心求教,有错误还请指正轻拍,谢谢
版权声明:本文出自志健的原创文章,未经博主允许不得转载