Java中IdentityHashMap与HashMap区别详解
IdentityHashMap与HashMap区别
你真的了解IdentityHashMap与HashMap区别吗?
很多人不晓得IdentityHashMap的存在,其中不乏工作很多年的Java开发者,他们看到就说是第三方jar包,实际上它是Jdk源码自带的集合类。
那它们有何区别呢? 趣答:
穿同样颜色衣服的双胞胎(HashMap)
穿不同颜色双胞胎弟弟(IdentityHashMap)
HashMap
对于常用的HashMap来说,我们都知道只要key的值相同(严谨说法是:key.equals(k)) 那么我们认为他们是同一个可以Entry。如果我们把颜色作为研究对象:key值,那么我们就得出双胞胎兄弟的颜色一致,key.equals(k)=true,他们是同一个人(脸盲症)。
JDK源码:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
IdentityHashMap
而对于IdentityHashMap则不同,他是非分明,他只承认key==e.key的结果为true时,才认为是相同的Entry。不管双胞胎弟弟今天穿绿色,明天穿蓝色,他都认为你是同一个人,不会“脸盲”。
if (item == k)
代码举例
package com.scc; import java.awt.Color; /** * 双胞兄弟 */ public class Twins { /** * 衣服颜色 */ private Color color; public Twins(Color color) { this.color = color; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Twins)) { return false; } Twins user = (Twins)o; return color.equals(user.color); } @Override public int hashCode() { int result = 17; result = 31 * result + color.hashCode(); return result; } public void setColor(Color color) { this.color = color; } }
package com.scc; import java.awt.Color; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; public class MainTest { public static void main(String[] args) { Map<Twins, String> hashMap = new HashMap<Twins, String>(); Map<Twins, String> identityMap = new IdentityHashMap<Twins, String>(); // 兄弟 Twins brother = new Twins(Color.green); // 哥哥 Twins eldBrother = new Twins(Color.green); hashMap.put(brother, "弟弟"); hashMap.put(eldBrother, "哥哥"); System.out.println(hashMap);//{com.scc.Twins@ff01010f=哥哥} 结果却只有哥哥 identityMap.put(brother, "绿色衣服的弟弟"); //第二天弟弟换了一身蓝衣服 brother.setColor(Color.BLUE); identityMap.put(brother, "蓝色衣服的弟弟"); System.out.println(identityMap);//{com.scc.Twins@ff00030e=蓝色衣服的弟弟} 结果弟弟还是弟弟,只是颜色不同罢了 } }
到此这篇关于Java中IdentityHashMap与HashMap区别详解的文章就介绍到这了,更多相关IdentityHashMap与HashMap区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中反射的"暴破"机制(SetAccessible方法)详解
这篇文章主要为大家详细介绍了Java中反射的"暴破"机制,以及如何利用这一机制实现访问非公有属性,方法,和构造器,文中示例代码讲解详细,感兴趣的可以了解一下2022-08-08Mybatis基于MapperScan注解的动态代理加载机制详解
这篇文章主要介绍了Mybatis基于MapperScan注解的动态代理加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧2023-01-01使用CI/CD工具Github Action发布jar到Maven中央仓库的详细介绍
今天通过对Github Action的简单使用来介绍了CI/CD的作用,这个技术体系是项目集成交付的趋势,也是面试中的一个亮点技能。 而且这种方式可以实现“一次配置,随时随地集成部署”,感兴趣的朋友一起看看吧2021-07-07
最新评论