温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行IdentityHashMap集合的源码解析

发布时间:2021-12-08 15:45:22 来源:亿速云 阅读:76 作者:柒染 栏目:大数据

如何进行IdentityHashMap集合的源码解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

我们将介绍一下IdentityHashMap集合的相关知识。看名字我们知道IdentityHashMap集合底层是通过HashMap集合实现的。那么按照我们分析其它集合一样,它也一定是具有某种特殊的特性的,否则Java也不会提供一个单独的IdentityHashMap集合了。我们先不介绍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集合的底层源码,来证明我们上述所说的。

如何进行IdentityHashMap集合的源码解析

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI