Java中IdentityHashMap與HashMap區(qū)別詳解
IdentityHashMap與HashMap區(qū)別
你真的了解IdentityHashMap與HashMap區(qū)別嗎?
很多人不曉得IdentityHashMap的存在,其中不乏工作很多年的Java開發(fā)者,他們看到就說是第三方j(luò)ar包,實(shí)際上它是Jdk源碼自帶的集合類。
那它們有何區(qū)別呢? 趣答:
穿同樣顏色衣服的雙胞胎(HashMap)
穿不同顏色雙胞胎弟弟(IdentityHashMap)
HashMap
對(duì)于常用的HashMap來說,我們都知道只要key的值相同(嚴(yán)謹(jǐn)說法是:key.equals(k)) 那么我們認(rèn)為他們是同一個(gè)可以Entry。如果我們把顏色作為研究對(duì)象:key值,那么我們就得出雙胞胎兄弟的顏色一致,key.equals(k)=true,他們是同一個(gè)人(臉盲癥)。
JDK源碼:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
IdentityHashMap
而對(duì)于IdentityHashMap則不同,他是非分明,他只承認(rèn)key==e.key的結(jié)果為true時(shí),才認(rèn)為是相同的Entry。不管雙胞胎弟弟今天穿綠色,明天穿藍(lán)色,他都認(rèn)為你是同一個(gè)人,不會(huì)“臉盲”。
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=哥哥} 結(jié)果卻只有哥哥 identityMap.put(brother, "綠色衣服的弟弟"); //第二天弟弟換了一身藍(lán)衣服 brother.setColor(Color.BLUE); identityMap.put(brother, "藍(lán)色衣服的弟弟"); System.out.println(identityMap);//{com.scc.Twins@ff00030e=藍(lán)色衣服的弟弟} 結(jié)果弟弟還是弟弟,只是顏色不同罷了 } }
到此這篇關(guān)于Java中IdentityHashMap與HashMap區(qū)別詳解的文章就介紹到這了,更多相關(guān)IdentityHashMap與HashMap區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截的教程
我們寫的任何一個(gè)項(xiàng)目,都應(yīng)該有安全防護(hù),不應(yīng)該讓這個(gè)項(xiàng)目進(jìn)行“裸奔”,否則很容易被別人進(jìn)行攻擊。而在SpringBoot環(huán)境中,其實(shí)可以很容易實(shí)現(xiàn)安全保護(hù),本文給大家介紹SpringBoot如何整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截,需要的朋友可以參考下2023-05-05Android?Studio?中Gradle配置sonarqube插件(推薦)
Sonarqube作為一個(gè)很實(shí)用的靜態(tài)代碼分析工具,在很多項(xiàng)目中都使用,本文重點(diǎn)給大家介紹Android?Studio?中Gradle配置sonarqube插件的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2022-03-03Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn)解析
這篇文章主要介紹了Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn),IOC是Spring的核心思想之一,它通過將對(duì)象的創(chuàng)建、依賴注入和生命周期管理交給容器來實(shí)現(xiàn)解耦,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),需要的朋友可以參考下2025-02-02解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system
今天小編就為大家分享一篇關(guān)于解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system的異常問題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼
這篇文章主要介紹了如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語句)
這篇文章主要介紹了SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語句),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java二分查找算法實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java二分查找算法實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11