在Map中實(shí)現(xiàn)key唯一不重復(fù)操作
Map中如何實(shí)現(xiàn)key唯一不重復(fù)
問題:如何做到Map中key唯一不重復(fù),每次都遍歷來equals比較嗎?
首先,答案是否。如果全部遍歷的話,當(dāng)Map中元素很多的時候,顯然查詢效率低。
解釋: HashMap屬于散列存儲結(jié)構(gòu),其table的存儲是放在不同的Jvm內(nèi)存區(qū)域。通過一個整型值來標(biāo)識table的區(qū)域,相當(dāng)于這個區(qū)域的下標(biāo)。然后整個查找過程就從不再需要遍歷整個table,只需遍歷這一區(qū)域的數(shù)據(jù)即可。
結(jié)合HashMap.class中的put方法來說明:
如何找到這個區(qū)域呢?
1.首先將傳入的key值用hash方法轉(zhuǎn)化為int型的hash值,并且通過該方法讓hash值變得各位更均勻一些。變得更均勻的目的是讓每一個區(qū)域的大小更加等分些,公平利用存儲空間,查詢速度得到提升。
2.而后的indexfor方法將根據(jù)其hash值和table的大小得到這個區(qū)域的“位置下標(biāo)”。具體其方法的實(shí)現(xiàn)同樣也是為了讓各個區(qū)域分布的更加均勻。
得到這個區(qū)域以后,再遍歷這個區(qū)域來找到對應(yīng)的元素
1.通過for循環(huán)遍歷這個區(qū)域的鏈表,在循環(huán)中如果key值的hash值相等,并且其key值相等,那么進(jìn)行覆蓋原元素操作。
2.如果遍歷結(jié)束依然沒找到,則新添元素
Map放入相同的key值
因?yàn)镸ap本身是不可以放相同的key的,但是如果我們想,也是有辦法的。
另外java也給我們提供了一個鉆空子的方法,這就是JDK1.8的IdentityHashMap,也是Map的一個實(shí)現(xiàn)類
HashMap比較key的值是用equals來比較的,所以只要key的值一樣,就會被認(rèn)為是同一個key。而IdentityHashMap是用==來比較key的存放地址,所以,只要我們重新new出來一個對象,就可以把值相同的key定義為值相等但地址不相同的key,這樣就不會被認(rèn)為是同一個key
public class MapTest { public static void main(String[] args) { Map map = new IdentityHashMap(); map.put(new Integer(1), "tom"); map.put(new Integer(1), "ben"); map.put(new Integer(1), "cat"); map.put(new Integer(1), "dog"); System.out.println(map); } }
輸出結(jié)果是:
{1=tom, 1=dog, 1=cat, 1=ben}
另外HashMap還可以自己重寫hashCode和put來實(shí)現(xiàn)hashCode的值不一樣,從而不會被認(rèn)為是同一個key,繼續(xù)研究。。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 啟動項(xiàng)目打印接口列表的實(shí)現(xiàn)
這篇文章主要介紹了springboot 啟動項(xiàng)目打印接口列表的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringCloud Zuul網(wǎng)關(guān)功能實(shí)現(xiàn)解析
這篇文章主要介紹了SpringCloud Zuul網(wǎng)關(guān)功能實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02spring boot實(shí)戰(zhàn)教程之shiro session過期時間詳解
這篇文章主要給大家介紹了關(guān)于spring boot實(shí)戰(zhàn)教程之shiro session過期時間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-10-10在IDEA中使用debug工具去運(yùn)行java程序的實(shí)現(xiàn)步驟
調(diào)試工具(debug工具)是一種用于幫助程序員識別和修復(fù)程序中的錯誤的工具,它們提供了一系列的功能,幫助程序員在代碼執(zhí)行的過程中跟蹤和檢測問題,本文將給大家介紹使用debug工具去運(yùn)行java程序的實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-04-04SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案
這篇文章主要介紹了SpringBoot項(xiàng)目中改變web服務(wù)的路徑的兩種方案,通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08