HashMap插入相同key问题

 更新时间:2022年05月07日 10:40:30   作者:古镇黄渤  
这篇文章主要介绍了HashMap插入相同key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

HashMap插入相同key

HashMap插入的描述

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

我的问题

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

想法

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

贴上代码

import java.util.ArrayList;
import java.util.HashMap; 
public class MapAndLink { 
    public static void main(String[] args){ 
        HashMap<Integer, ArrayList> 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<Integer, ArrayList> map){
        ArrayList<Integer> 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) {
        
        Map a = new HashMap();
        // 枚举类型的一个 WED
        a.put(Week.WED, "星期二");        
        a.put("WED", "星期三");        
        System.out.println(a);
    }
}

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

看到结果没有,两个一模一样的key,看到这里我就稍稍有一点懵了,这时我马上想到了Hashmap的底层实现,其中put方法的底层是调用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是不允许重复的,我们看到的重复只是程序欺骗了我们的双眼。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用java实现银行家算法

    使用java实现银行家算法

    这篇文章主要为大家详细介绍了如何使用java实现银行家算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Springboot引入拦截器并放行swagger代码实例

    Springboot引入拦截器并放行swagger代码实例

    这篇文章主要介绍了Springboot引入拦截器并放行swagger代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java编程一道多线程问题实例代码

    Java编程一道多线程问题实例代码

    这篇文章主要介绍了Java编程一道多线程问题实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Spring  ApplicationContextAware 接口的作用及使用方式

    Spring  ApplicationContextAware 接口的作用及使用方式

    Spring提供了许多回调接口,用于Bean生命周期中执行特定的操作,通过实现ApplicationContextAware接口,Spring提供了一种便捷的方式让 Bean获取对Spring容器的引用,本文介绍ApplicationContextAware接口的作用、使用方式,以及在实际应用中的常见场景,感兴趣的朋友一起看看吧
    2024-01-01
  • java多线程之线程同步七种方式代码示例

    java多线程之线程同步七种方式代码示例

    这篇文章主要介绍了java多线程之线程同步七种方式代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • idea开启热部署Devtools的步骤详解

    idea开启热部署Devtools的步骤详解

    当我们在 idea 中修改代码的时候,idea 并不会自动的重启去响应我们修改的内容,而是需要我们手动的重新启动项目才可以生效,这个是非常不方便,但是可以在 idea 中开启这个自动热部署的功能,本文给大家介绍了idea开启热部署Devtools的步骤,需要的朋友可以参考下
    2024-03-03
  • Java 输入输出 IO NIO AIO三兄弟对比分析对比分析

    Java 输入输出 IO NIO AIO三兄弟对比分析对比分析

    这篇文章主要为大家介绍了Java 输入输出 IO NIO AIO三兄弟对比分析对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java 8中default方法能做什么?不能做什么?

    Java 8中default方法能做什么?不能做什么?

    这篇文章主要给大家介绍了关于Java 8中default方法能做什么?不能做什么?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

    Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

    这篇文章主要介绍了Java基于装饰者模式实现的图片工具类,结合完整实例形式分析了装饰者模式实现图片的判断、水印、缩放、复制等功能,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2017-09-09
  • spring使用aspect注解切面不起作用的排查过程及解决

    spring使用aspect注解切面不起作用的排查过程及解决

    这篇文章主要介绍了spring使用aspect注解切面不起作用的排查过程及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论