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 相关文章推荐
浅谈自定义校验注解ConstraintValidator
Jun 30 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
Java练习之潜艇小游戏的实现
Mar 16 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Apr 26 Java/Android
Java数据结构之堆(优先队列)
May 20 Java/Android
多线程Spring通过@Scheduled实现定时任务
May 25 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 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计算整个目录大小的方法
2015/06/19 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
use jscript List Installed Software
2007/06/11 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
js的一些常用方法小结
2011/06/29 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
python文件的md5加密方法
2016/04/06 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
装饰资料员岗位职责
2013/12/30 职场文书
工作失职检讨书范文
2014/01/16 职场文书
教师业务学习制度
2014/01/25 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
活动总结新闻稿
2014/08/30 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
党员转正党支部意见
2015/06/02 职场文书
超市店长竞聘书
2015/09/15 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js