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 相关文章推荐
源码解读Spring-Integration执行过程
Jun 11 Java/Android
springcloud之Feign超时问题的解决
Jun 24 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
May 20 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 Java/Android
java实现面板之间切换功能
Jun 10 Java/Android
Springboot集成kafka高级应用实战分享
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
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
jQuery1.6 使用方法一
2011/11/23 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
2020/04/28 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python 异常处理的实例详解
2017/09/11 Python
在python中pandas的series合并方法
2018/11/12 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
初中生物教学反思
2014/01/10 职场文书
驻村工作先进事迹
2014/08/14 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
创业计划书之面包店
2019/09/17 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python