HashMap插入相同key问题

网友投稿 1952 2022-10-07

HashMap插入相同key问题

HashMap插入相同key问题

目录HashMap插入相同keyHashMap插入的描述我的问题想法HashMap的key能不能重复我们看看实际代码说下重点

HashMap插入相同key

HashMap插入的描述

使用HashMap在插入操作时,会通过equal方法判断key是否相同。如果相同,则将覆盖对应的value;不相同才使用新的“桶”。

我的问题

当往HashMap中插入数据,即使有相同的key,但是能不能不进行覆盖操作,而是把新的value放在原有的value附近能够找到的位置?

想法

呃,其实大概方向就是通过一个HashMap实现。。。

贴上代码

import java.util.ArrayList;

import java.util.HashMap;

public class MapAndLink {

public static void main(String[] args){

HashMap map = new HashMap<>();

put(1, 1, map);

put(1, 3, map);

put(2, 2, map);

put(3, 4, map);

put(1, 3, map);

System.out.println(map.toString());

}

public static void put(Integer key, Integer str, HashMap map){

ArrayList list = map.get(key);

if(list == null)

list = new ArrayList();

for(int i = 0; i < list.size(); ++i){

if(list.get(i).equals(str))

return;

}

list.add(str);

map.put(key, list);

}

}

再贴上输出结果

{1=[1, 3], 2=[2], 3=[4]}

HashMap的key能不能重复

今天测试同学给我提了一个bug,我看了bug描述很快定位了bug问题原因,乍一看这个问题的时候我当时很惊讶,HashMap的key应该是不允许重复的啊,为啥我put了两个一样的key,map中居然存入了两个一模一样个的key值,真是奇了怪了

我们看看实际代码

public enum Week {

WED;

}

public class T {

public static void main(String[] args) {

QktRpAtAmr

Map a = new HashMap();

// 枚举类型的一个 WED

a.put(Week.WED, "星期二");

a.put("WED", "星期三");

System.out.println(a);

}

}

我们debug看一下这个map的返回结果:

看到结果没有,两个一模一样的key,看到这里我就稍稍有一点懵了,这时我马上想到了Hashmap的底层实现,其中phttp://ut方法的底层是调用putVal(has(key),val,....),key是由传入的参数经过hascode()计算得出的,既然map里存了两个相同的key,那么它们的hascode一定是不相同的,继续看has()方法的底层,实际就是调用了传入这个Object.hascode(),这时其实答案就已经浮出水面了,问题点就是出在我传入的两个key的类型上,虽然我们表面看枚举WED和字符串的值是相同的,可是它们对应的类型一个是String,一个是Enum,这时候我们继续看源码可以发现,String和Enum的hascode是完全不同的

从这里我们可以看出来,实际我们存入map中的key是我们的枚举类Week,而另一个则是String类型的一个字符串,既然知道了问题的原因,那么我们就有了相应的解决办法。

我们知道在使用枚举类型时,如果不指定枚举中常量的值,默认是直接返回这个常量name的,但是返回的这个name并不是String类型,而是一个Enum类型,所以在使用枚举类型时候一定要注意。

说下重点

在判断常量值是否相等的时候,要么重新value方法,要么使用name().toString()方法来进行校验。除此之外,我们在使用HashMap的时候,如果在不指定,?>key和value的类型的时候,切记不要想当然的认为看到的key相同,存入的key就一定是相同的。

结论:Hashmap中的key是不允许重复的,我们看到的重复只是程序欺骗了我们的双眼。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[Spring Boot]通过命令启动&关闭
下一篇:微信小程序开发页面拦截器的详解(微信小程序被拦截怎么办)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~