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

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.