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实践之适配器模式
Jun 18 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
JUnit5常用注解的使用
Jul 02 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 Java/Android
Java实现注册登录跳转
Jun 16 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
2016/05/21 PHP
js 立即调用的函数表达式如何写
2014/01/12 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
详细介绍Python函数中的默认参数
2015/03/30 Python
python中随机函数random用法实例
2015/04/30 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Python文件操作函数用法实例详解
2019/12/24 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
建筑专业自荐信范文
2014/01/05 职场文书
家长给老师的道歉信
2014/01/13 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
农民工讨薪标语
2014/06/26 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
个人廉洁自律总结
2015/03/06 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
导游词之岳阳楼
2019/09/25 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis