码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap使用注意事项

时间:2018-10-20 11:42:59      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:原因   hash   内容   数字   object   code   位置   main   info   

在工作中碰到过一次HashMap的使用造成的Bug,觉得挺有意思。

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 
 4 public class HashMapTest {
 5 
 6     public static void main(String[] args) {
 7 
 8         Map<Integer, String> map = new HashMap<>();
 9         map.put(0, "0");
10         map.put(1, "1");
11         map.put(2, "2");
12         map.put(3, "3");
13         map.put(4, "4");
14         for (short i = 0; i < 5 ; i++) {
15             System.out.println(map.get(i));;
16         }
17     }
18 }

上面代码输出全为null,为什么呢?

原因如下:

map的key为Integer类型,java中的数字常量默认为int,当往map里put内容时,key会从小写的int装箱成Integer对象。

HashMap中的get方法定义如下:

技术分享图片

当15行调用map.get(i)时,因为i是short类型,会被自动装箱为Short对象。跟踪map.ge(Object key)方法继续往里走:

get方法首先拿到key的hashcode,然后跟数组表长度-1相与得到索引位置,将索引位置存储的Node中的key的

hashcode与传入key的hashcode作比较,并且比较key的内存地址或者key是否equals。

技术分享图片

这个地方可以清楚看到,Map中Node存储的key为Integer对象,我们传入的key为Short对象,虽然两者的hashcode是一样的,当无论== 还是equals都不相等,所以无法拿到Node中的value。

总结:

1、hashcode一样,对象不一定相同(无论内存地址还是逻辑内容)。

2、对于泛型集合装基本数据类型时,要注意装箱问题。

HashMap使用注意事项

标签:原因   hash   内容   数字   object   code   位置   main   info   

原文地址:https://www.cnblogs.com/fly1024/p/9820854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!