IdentityHashMap :key值可以重复的Map集合

2024-02-02 20:08

本文主要是介绍IdentityHashMap :key值可以重复的Map集合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 问题引入

    初学java的时候,Map集合给人留下的印象就是键值对{key=value}的存储方式。并且我们知道键值对的key唯一。但是Map容器真的不能存储key值相同的数据吗?查询API才发现有这么一个实现类可以存储重复的key:IdentityHashMap。

  • IdentityHashMap简介

    IdentityHashMap类同样实现了Map接口,拥有Map集合的一切特性。key值同样需要判断是不是重复,只不过就是判断的方法和其他Map的实现类不一样。

    我们来看看官方的定义:
    java.util.IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。 换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等(在正常 Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。

    也就是说,IdentityHashMap比较的单单key的值,它不管可以的内存地址还是基本数据类型。而正常的Map实现比较的是具体的内容。

  • 简单的小Demo

public class IdentityHashMapDemo {public static void main(String[] args) {//测试key可以重复的map集合HashMap<Object, String> map = new HashMap<>();IdentityHashMap<Object, String> idenMap = new IdentityHashMap<>();idenMap.put("测试", "成功");idenMap.put("测试", "失败");map.put("测试", "成功");map.put("测试", "失败");System.out.println("IdentityHashMap运行结果:"+idenMap);System.out.println("HashMap运行结果:"+map);System.out.println("-------------------------------------------------------");idenMap.put(new String("对象"), "成功");idenMap.put(new String("对象"), "失败");map.put(new String("对象"), "成功");map.put(new String("对象"), "失败");System.out.println("IdentityHashMap运行结果:"+idenMap);System.out.println("HashMap运行结果:"+map);}
}//运行结果
/*IdentityHashMap运行结果:{测试=失败}HashMap运行结果:{测试=失败}------------------------------------------------------注意:这里手动过滤掉第一次存入的结果,方便观察。IdentityHashMap运行结果:{对象=成功, 对象=失败}HashMap运行结果:{对象=失败}
*/
  • 结果分析

可以看出:
如果存放的是非对象,IdentityHashMap和其他Map的实现没有区别。区别在与可一直存放的对象。使用两次new String() 创建的对象的内存地址必然不会相同,但是指向的内容是相同的。所以HashMap会认为是同一个key从而覆盖前一个key对应的值。但是IdentityHashMap只会去比较key实际的值,也就是内存地址而不会管他具体的内容。所以认为不是同一个key。

  • Q&A
String str = new String("abc"//这句代码到底创建了几个对象?
String str = "abc" //该代码和上述代码有什么区别?/*第一段代码实际创建了两个对象。第二段代码创建了一个对象。("abc")就相当于第二段代码。这时已经创建了一次对象。再遇到new关键字时,创建第二个对象这个对象保存的是"abc"的内存地址,并没有真正的指向字符串"abc"。String str = "abc"是字符串比较特别的创建对象的方式。创建之后会作为常量保存在方法区的常量池中。它创建对象的时候,会先在常量池中查询有没有已经的存在的字符串常量,如果有就会把其对应的地址给它,如果没有才会创建。*/

这篇关于IdentityHashMap :key值可以重复的Map集合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671814

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​