在Map中實(shí)現(xiàn)key唯一不重復(fù)操作
Map中如何實(shí)現(xiàn)key唯一不重復(fù)
問(wèn)題:如何做到Map中key唯一不重復(fù),每次都遍歷來(lái)equals比較嗎?
首先,答案是否。如果全部遍歷的話,當(dāng)Map中元素很多的時(shí)候,顯然查詢效率低。
解釋: HashMap屬于散列存儲(chǔ)結(jié)構(gòu),其table的存儲(chǔ)是放在不同的Jvm內(nèi)存區(qū)域。通過(guò)一個(gè)整型值來(lái)標(biāo)識(shí)table的區(qū)域,相當(dāng)于這個(gè)區(qū)域的下標(biāo)。然后整個(gè)查找過(guò)程就從不再需要遍歷整個(gè)table,只需遍歷這一區(qū)域的數(shù)據(jù)即可。
結(jié)合HashMap.class中的put方法來(lái)說(shuō)明:

如何找到這個(gè)區(qū)域呢?
1.首先將傳入的key值用hash方法轉(zhuǎn)化為int型的hash值,并且通過(guò)該方法讓hash值變得各位更均勻一些。變得更均勻的目的是讓每一個(gè)區(qū)域的大小更加等分些,公平利用存儲(chǔ)空間,查詢速度得到提升。
2.而后的indexfor方法將根據(jù)其hash值和table的大小得到這個(gè)區(qū)域的“位置下標(biāo)”。具體其方法的實(shí)現(xiàn)同樣也是為了讓各個(gè)區(qū)域分布的更加均勻。
得到這個(gè)區(qū)域以后,再遍歷這個(gè)區(qū)域來(lái)找到對(duì)應(yīng)的元素
1.通過(guò)for循環(huán)遍歷這個(gè)區(qū)域的鏈表,在循環(huán)中如果key值的hash值相等,并且其key值相等,那么進(jìn)行覆蓋原元素操作。
2.如果遍歷結(jié)束依然沒(méi)找到,則新添元素
Map放入相同的key值
因?yàn)镸ap本身是不可以放相同的key的,但是如果我們想,也是有辦法的。
另外java也給我們提供了一個(gè)鉆空子的方法,這就是JDK1.8的IdentityHashMap,也是Map的一個(gè)實(shí)現(xiàn)類
HashMap比較key的值是用equals來(lái)比較的,所以只要key的值一樣,就會(huì)被認(rèn)為是同一個(gè)key。而IdentityHashMap是用==來(lái)比較key的存放地址,所以,只要我們重新new出來(lái)一個(gè)對(duì)象,就可以把值相同的key定義為值相等但地址不相同的key,這樣就不會(huì)被認(rèn)為是同一個(gè)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來(lái)實(shí)現(xiàn)hashCode的值不一樣,從而不會(huì)被認(rèn)為是同一個(gè)key,繼續(xù)研究。。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
分享幾個(gè)Java工作中實(shí)用的代碼優(yōu)化技巧
這篇文章主要給大家分享幾個(gè)Java工作中實(shí)用代碼優(yōu)化技巧,文章基于Java的相關(guān)資料展開(kāi)對(duì)其優(yōu)化技巧的分享,需要的小伙伴可以參考一下2022-04-04
Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法示例
這篇文章主要介紹了Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法,涉及java web定時(shí)任務(wù)控制類定義、調(diào)用及監(jiān)聽(tīng)器定義、添加等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
IDEA設(shè)置JVM可分配內(nèi)存大小和其他參數(shù)的教程
這篇文章主要介紹了IDEA設(shè)置JVM可分配內(nèi)存大小和其他參數(shù)的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
Java8 Collectors求和功能的自定義擴(kuò)展操作
這篇文章主要介紹了Java8 Collectors求和功能的自定義擴(kuò)展操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java實(shí)現(xiàn)將方法作為參數(shù)傳遞的方法小結(jié)
在Java編程中,將方法作為參數(shù)傳遞是一種強(qiáng)大的技術(shù),可以提高代碼的靈活性和可重用性,本文將探討幾種在Java中實(shí)現(xiàn)這一目標(biāo)的方法,需要的朋友可以參考下2025-03-03
jdbc連SQL?server顯示1433端口連接失敗圖文解決方法
這篇文章主要給大家介紹了關(guān)于jdbc連SQL?server顯示1433端口連接失敗的圖文解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-06-06

