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 相关文章推荐
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
SpringBoot整合阿里云视频点播的过程详解
Dec 06 Java/Android
mybatis源码解读之executor包语句处理功能
Feb 15 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
java版 联机五子棋游戏
May 04 Java/Android
Java 多线程协作作业之信号同步
May 11 Java/Android
Java完整实现记事本代码
Jun 16 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
Java结构型设计模式之组合模式详解
Sep 23 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简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
php异常处理捕获错误整理
2019/09/23 PHP
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python实现图像拼接
2020/03/05 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
户籍证明的格式
2014/01/13 职场文书
五十岁生日宴会答谢词
2014/01/15 职场文书
护士求职自荐信范文
2014/03/19 职场文书
学习经验交流会主持词
2014/04/01 职场文书
影子教师研修方案
2014/06/14 职场文书
中专生自荐信
2014/06/25 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
名人传读书笔记
2015/06/26 职场文书
浅谈Python协程asyncio
2021/06/20 Python