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并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
springcloud整合seata
May 20 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 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利用事务处理转账问题实例
2015/02/11 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python搜索指定目录的方法
2015/04/29 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
python使用matplotlib绘制热图
2018/11/07 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Python内置函数property()如何使用
2020/09/01 Python
python中altair可视化库实例用法
2021/01/26 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
小学三八妇女节活动方案
2014/03/16 职场文书
社区消防工作实施方案
2014/03/21 职场文书
小摄影师教学反思
2014/04/27 职场文书
公路绿化方案
2014/05/12 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
先进工作者申报材料
2014/12/23 职场文书
网络妈妈观后感
2015/06/08 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers