HashMap的get方法传入不一致类型的key?

今天同事向我抱怨了一个他最近使用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, 虚心求教,有错误还请指正轻拍,谢谢

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值