HashMap实现保存两个key相同的数据


Posted in Java/Android onJune 30, 2021

HashMap如何保存两个key相同的数据

最近一个朋友去面试了,面试官问了一个关于HashMap的问题:HashMap如何保存两个key相同的数据?

准确来说,应该是Map中如何保存两个key相同的数据,因为用来实现这个功能的IdentityHashMap类和HashMap虽然都是实现了Map接口,但本质是属于不同的东西;

我们知道在HashMap中,如果key相同就会被覆盖,那IdentityHashMap是怎么实现这个功能的呢?

java jdk源码中,IdentityHashMap类上写了100来行注释的代码,如果用一句话来总结的话:

IdentityhashMap类利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性,也就是说key(value)比较的时候只比较两个key是否引用同一个对象,比较的是对象的地址;

测试1:

public static void main(String[] args) {
    String str1 = "key";
    String str2 = "key";
    System.out.println(str1==str2);
    Map<String, String> map = new IdentityHashMap<>();
    map.put(str1, "value1");
    map.put(str2, "value2");
    map.forEach((k,v)-> System.out.println(k+"->"+v));
}

打印:

true

key->value2

测试1中,将字符串"key"直接赋值给str1和str2,因为字符串是放在常量池中的,所以str1和str2实际上还是同一个对象,所以它们的key值是相同的,会被覆盖;

测试2:

public static void main(String[] args) {
    String str1 = new String("key");
    String str2 = new String("key");
    System.out.println(str1==str2);
    Map<String, String> map = new IdentityHashMap<>();
    map.put(str1, "value1");
    map.put(str2, "value2");
    map.forEach((k,v)-> System.out.println(k+"->"+v));
}

打印:

false

key value1

key value2

测试2中,str1和str2是通过new的方式创建出来的,属于不同对象,所以它们的引用不同,key值也就不同,所以put的时候不会被覆盖;

关于IdentityHashMap常不常用,实际开发中我基本没用过,所以在什么场景会用到IdentityHashMap我也说不出个一二来;不过存在即合理,肯定有什么场景会用到的,后面遇到我会及时更新~

HashMap插入相同key

使用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]}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
java设计模式--建造者模式详解
Jul 21 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
解析mybatis-plus中的resultMap简单使用
Nov 23 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 Java/Android
spring boot项目application.properties文件存放及使用介绍
springboot项目以jar包运行的操作方法
Springboot使用Spring Data JPA实现数据库操作
Jun 30 #Java/Android
如何给HttpServletRequest增加消息头
解决ObjectMapper.convertValue() 遇到的一些问题
Jun 30 #Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
You might like
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
Javascript Objects详解
2014/09/04 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
python3.6数独问题的解决
2019/01/21 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
什么是Python变量作用域
2020/06/03 Python
Python 字符串池化的前提
2020/07/03 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
酒吧创业计划书
2014/01/18 职场文书
演讲主持词
2014/03/18 职场文书
开工仪式主持词
2014/03/20 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
电子商务实训报告总结
2014/11/05 职场文书
困难补助申请报告
2015/05/19 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers