前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IdentityHashMap集合源码解析

IdentityHashMap集合源码解析

作者头像
吉林乌拉
发布2019-08-14 17:40:58
3240
发布2019-08-14 17:40:58
举报
文章被收录于专栏:吉林乌拉吉林乌拉

在这一篇中我们将介绍一下IdentityHashMap集合的相关知识。看名字我们知道IdentityHashMap集合底层是通过HashMap集合实现的。那么按照我们分析其它集合一样,它也一定是具有某种特殊的特性的,否则Java也不会提供一个单独的IdentityHashMap集合了。我们先不介绍IdentityHashMap集合有哪种特性,我们先看下面的例子,然后在做详细说明。

看输出结果我们对HashMap集合的输出结果不会感到意外,但是IdentityHashMap集合的结果却很让人费解。因为按照我们以前对集合的分析,不是说在HashMap中不允许有重复的key存在吗,如果有相同的key则后添加到集合中的元素的value会覆盖前一个元素中的value,这也是我们在分析HashMap那篇文章中总结出的HashMap的特性。那么为什么在IdentityHashMap集合中却可以保存两个相同的key呢?其实答案很简单,这就是IdentityHashMap集合的特性所在。

我们在分析HashMap底层实现时知道,在HashMap集合中首先会判断key的hashCode是否相等,然后在判断key是否相等。如果这两个判断都相等则认为当前存储的两个元素的key是相等的,于是就执行value的覆盖操作。并且上述判断不但会判断==还会用equals方法判断。这也是为什么在将对象类型的数据保存在HashMap集合中必须重写equals方法的根本原因。如果不这样做HashMap集合就会认为这两个元素的key不是相同的。这也就是IdentityHashMap集合与HashMap集合的底层实现不同的根本所在,就是因为在IdentityHashMap集合中只会用==判断两个key是否相等,而不会调用key的equals方法判断。如果两个key==相等则IdentityHashMap集合就会认为这两个key相等,于是执行value的覆盖操作。如果保存在IdentityHashMap集合中的key==不相等,则就会把这两个key所对应的元素都保存在集合中,而不会执行value的覆盖操作。

在上述代码中我们创建了两个String对象,并且我们知道在Java中如果不是基本数据类型采用==比较的话,它们实际比较的是内存地址。因为我们创建了两个String对象,所以上述的比较结果一定为false。所在IdentityHashMap集合就会认为这两个key是不同的key,于是将这两个元素都保存在集合中。而在HashMap集合中除了进行上述比较外,还会调用key的equals方法进行比较。因为我们保存的key是一个String,并且在String这个类中已经重写了equals方法,所以调用该方法实际比较的就是真正的值,也就是key和key做比较。正是因为它们相等,所以HashMap集合就会执行value的覆盖操作。所以在输出的结果中HashMap集合只会保存一个元素。下面我们看一下IdentityHashMap集合的底层源码,来证明我们上述所说的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档