Java中IdentityHashMap与HashMap区别详解
作者:pony-zi
这篇文章主要介绍了Java中IdentityHashMap与HashMap区别详解,很多人不晓得IdentityHashMap的存在,其中不乏工作很多年的Java开发者,他们看到就说是第三方jar包,实际上它是Jdk源码自带的集合类,需要的朋友可以参考下
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区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!