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并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
关于ObjectUtils.isEmpty() 和 null 的区别
Feb 28 Java/Android
java项目构建Gradle的使用教程
Mar 24 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Java实现带图形界面的聊天程序
Jun 10 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 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的面向对象编程
2006/10/09 PHP
一个程序下载的管理程序(三)
2006/10/09 PHP
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
前端微信支付js代码
2016/07/25 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
python使用xpath中遇到:到底是什么?
2018/01/04 Python
python实现归并排序算法
2018/11/22 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python异常处理和日志处理方式
2019/12/24 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
现金会计岗位职责
2013/12/05 职场文书
学校消防演习方案
2014/02/19 职场文书
社区好人好事材料
2014/12/26 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript