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 相关文章推荐
解决tk mapper 通用mapper的bug问题
Jun 16 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
Jpa Specification如何实现and和or同时使用查询
Nov 23 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
Java 定时任务技术趋势简介
May 04 Java/Android
SpringBoot项目部署到阿里云服务器的实现步骤
Jun 28 Java/Android
Java使用HttpClient实现文件下载
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开发环境配置记录
2011/01/14 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
python爬虫请求头的使用
2020/12/01 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
保护环境建议书400字
2014/05/13 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
2016小学新学期寄语
2015/12/04 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL