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

