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的常用工具
Jun 11 Java/Android
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
jackson json序列化实现首字母大写,第二个字母需小写
Jun 29 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
springboot应用服务启动事件的监听实现
Apr 06 Java/Android
JAVA长虹键法之建造者Builder模式实现
Apr 10 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 Java/Android
springboot 全局异常处理和统一响应对象的处理方式
Jun 28 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
深入理解Python中各种方法的运作原理
2015/06/15 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
自我评价个人范文
2013/12/16 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
社区端午节活动方案
2014/01/28 职场文书
运动会稿件200字
2014/02/07 职场文书
公司活动总结范文
2014/07/01 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS