HashMap插入相同key問題
HashMap插入相同key
HashMap插入的描述
使用HashMap在插入操作時,會通過equal方法判斷key是否相同。如果相同,則將覆蓋對應的value;不相同才使用新的“桶”。
我的問題
當往HashMap中插入數(shù)據(jù),即使有相同的key,但是能不能不進行覆蓋操作,而是把新的value放在原有的value附近能夠找到的位置?
想法
呃,其實大概方向就是通過一個HashMap<Integer, ArrayList>實現(xiàn)。。。
貼上代碼
import java.util.ArrayList; import java.util.HashMap;? public class MapAndLink {? ? ? public static void main(String[] args){? ? ? ? ? HashMap<Integer, ArrayList> map = new HashMap<>(); ? ? ? ? put(1, 1, map); ? ? ? ? put(1, 3, map); ? ? ? ? put(2, 2, map); ? ? ? ? put(3, 4, map); ? ? ? ? put(1, 3, map); ? ? ? ? System.out.println(map.toString()); ? ? } ? ? ? public static void put(Integer key, Integer str, HashMap<Integer, ArrayList> map){ ? ? ? ? ArrayList<Integer> list = map.get(key); ? ? ? ? if(list == null) ? ? ? ? ? ? list = new ArrayList(); ? ? ? ? for(int i = 0; i < list.size(); ++i){ ? ? ? ? ? ? if(list.get(i).equals(str)) ? ? ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? list.add(str); ? ? ? ? map.put(key, list); ? ? }? }
再貼上輸出結(jié)果
{1=[1, 3], 2=[2], 3=[4]}
HashMap的key能不能重復
今天測試同學給我提了一個bug,我看了bug描述很快定位了bug問題原因,乍一看這個問題的時候我當時很驚訝,HashMap的key應該是不允許重復的啊,為啥我put了兩個一樣的key,map中居然存入了兩個一模一樣個的key值,真是奇了怪了
我們看看實際代碼
public enum Week { WED; }
public class T { public static void main(String[] args) { Map a = new HashMap(); // 枚舉類型的一個 WED a.put(Week.WED, "星期二"); a.put("WED", "星期三"); System.out.println(a); } }
我們debug看一下這個map的返回結(jié)果:
看到結(jié)果沒有,兩個一模一樣的key,看到這里我就稍稍有一點懵了,這時我馬上想到了Hashmap的底層實現(xiàn),其中put方法的底層是調(diào)用putVal(has(key),val,....),key是由傳入的參數(shù)經(jīng)過hascode()計算得出的,既然map里存了兩個相同的key,那么它們的hascode一定是不相同的,繼續(xù)看has()方法的底層,實際就是調(diào)用了傳入這個Object.hascode(),這時其實答案就已經(jīng)浮出水面了,問題點就是出在我傳入的兩個key的類型上,雖然我們表面看枚舉WED和字符串的值是相同的,可是它們對應的類型一個是String,一個是Enum,這時候我們繼續(xù)看源碼可以發(fā)現(xiàn),String和Enum的hascode是完全不同的
從這里我們可以看出來,實際我們存入map中的key是我們的枚舉類Week,而另一個則是String類型的一個字符串,既然知道了問題的原因,那么我們就有了相應的解決辦法。
我們知道在使用枚舉類型時,如果不指定枚舉中常量的值,默認是直接返回這個常量name的,但是返回的這個name并不是String類型,而是一個Enum類型,所以在使用枚舉類型時候一定要注意。
說下重點
- 在判斷常量值是否相等的時候,要么重新value方法,要么使用name().toString()方法來進行校驗。
- 除此之外,我們在使用HashMap的時候,如果在不指定<?,?>key和value的類型的時候,切記不要想當然的認為看到的key相同,存入的key就一定是相同的。
結(jié)論:Hashmap中的key是不允許重復的,我們看到的重復只是程序欺騙了我們的雙眼。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud Gateway Hystrix fallback獲取異常信息的處理
這篇文章主要介紹了Spring Cloud Gateway Hystrix fallback獲取異常信息的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot中MybatisX插件的簡單使用教程(圖文)
MybatisX 是一款基于 IDEA 的快速開發(fā)插件,方便在使用mybatis以及mybatis-plus開始時簡化繁瑣的重復操作,本文主要介紹了SpringBoot中MybatisX插件的簡單使用教程,感興趣的可以了解一下2023-06-06SpringBoot實現(xiàn)郵件發(fā)送功能的姿勢分享
我們在日常開發(fā)中,經(jīng)常會碰到email郵件發(fā)送的場景,如發(fā)送驗證碼,向客戶發(fā)送郵件等等,這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)郵件發(fā)送的相關(guān)資料,需要的朋友可以參考下2021-08-08Spring MVC 攔截器 interceptor 用法詳解
這篇文章主要介紹了Spring MVC 攔截器 interceptor 用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07