Java中IdentityHashMap與HashMap區(qū)別詳解
IdentityHashMap與HashMap區(qū)別
你真的了解IdentityHashMap與HashMap區(qū)別嗎?
很多人不曉得IdentityHashMap的存在,其中不乏工作很多年的Java開發(fā)者,他們看到就說(shuō)是第三方j(luò)ar包,實(shí)際上它是Jdk源碼自帶的集合類。
那它們有何區(qū)別呢? 趣答:
穿同樣顏色衣服的雙胞胎(HashMap)
穿不同顏色雙胞胎弟弟(IdentityHashMap)
HashMap
對(duì)于常用的HashMap來(lái)說(shuō),我們都知道只要key的值相同(嚴(yán)謹(jǐn)說(shuō)法是: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-05
Android?Studio?中Gradle配置sonarqube插件(推薦)
Sonarqube作為一個(gè)很實(shí)用的靜態(tài)代碼分析工具,在很多項(xiàng)目中都使用,本文重點(diǎn)給大家介紹Android?Studio?中Gradle配置sonarqube插件的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2022-03-03
Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn)解析
這篇文章主要介紹了Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn),IOC是Spring的核心思想之一,它通過(guò)將對(duì)象的創(chuàng)建、依賴注入和生命周期管理交給容器來(lái)實(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的異常問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼
這篇文章主要介紹了如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
這篇文章主要介紹了SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java二分查找算法實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java二分查找算法實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

