欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

HashMap插入相同key問題

 更新時(shí)間:2022年05月07日 10:40:30   作者:古鎮(zhèn)黃渤  
這篇文章主要介紹了HashMap插入相同key問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

HashMap插入相同key

HashMap插入的描述

使用HashMap在插入操作時(shí),會(huì)通過equal方法判斷key是否相同。如果相同,則將覆蓋對(duì)應(yīng)的value;不相同才使用新的“桶”。

我的問題

當(dāng)往HashMap中插入數(shù)據(jù),即使有相同的key,但是能不能不進(jìn)行覆蓋操作,而是把新的value放在原有的value附近能夠找到的位置?

想法

呃,其實(shí)大概方向就是通過一個(gè)HashMap<Integer, ArrayList>實(shí)現(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能不能重復(fù)

今天測(cè)試同學(xué)給我提了一個(gè)bug,我看了bug描述很快定位了bug問題原因,乍一看這個(gè)問題的時(shí)候我當(dāng)時(shí)很驚訝,HashMap的key應(yīng)該是不允許重復(fù)的啊,為啥我put了兩個(gè)一樣的key,map中居然存入了兩個(gè)一模一樣個(gè)的key值,真是奇了怪了

我們看看實(shí)際代碼

public enum Week {    
    WED;  
}
public class T {
    public static void main(String[] args) {
        
        Map a = new HashMap();
        // 枚舉類型的一個(gè) WED
        a.put(Week.WED, "星期二");        
        a.put("WED", "星期三");        
        System.out.println(a);
    }
}

我們debug看一下這個(gè)map的返回結(jié)果:

看到結(jié)果沒有,兩個(gè)一模一樣的key,看到這里我就稍稍有一點(diǎn)懵了,這時(shí)我馬上想到了Hashmap的底層實(shí)現(xiàn),其中put方法的底層是調(diào)用putVal(has(key),val,....),key是由傳入的參數(shù)經(jīng)過hascode()計(jì)算得出的,既然map里存了兩個(gè)相同的key,那么它們的hascode一定是不相同的,繼續(xù)看has()方法的底層,實(shí)際就是調(diào)用了傳入這個(gè)Object.hascode(),這時(shí)其實(shí)答案就已經(jīng)浮出水面了,問題點(diǎn)就是出在我傳入的兩個(gè)key的類型上,雖然我們表面看枚舉WED和字符串的值是相同的,可是它們對(duì)應(yīng)的類型一個(gè)是String,一個(gè)是Enum,這時(shí)候我們繼續(xù)看源碼可以發(fā)現(xiàn),String和Enum的hascode是完全不同的

從這里我們可以看出來,實(shí)際我們存入map中的key是我們的枚舉類Week,而另一個(gè)則是String類型的一個(gè)字符串,既然知道了問題的原因,那么我們就有了相應(yīng)的解決辦法。

我們知道在使用枚舉類型時(shí),如果不指定枚舉中常量的值,默認(rèn)是直接返回這個(gè)常量name的,但是返回的這個(gè)name并不是String類型,而是一個(gè)Enum類型,所以在使用枚舉類型時(shí)候一定要注意。

說下重點(diǎn)

  • 在判斷常量值是否相等的時(shí)候,要么重新value方法,要么使用name().toString()方法來進(jìn)行校驗(yàn)。
  • 除此之外,我們?cè)谑褂肏ashMap的時(shí)候,如果在不指定<?,?>key和value的類型的時(shí)候,切記不要想當(dāng)然的認(rèn)為看到的key相同,存入的key就一定是相同的。

結(jié)論:Hashmap中的key是不允許重復(fù)的,我們看到的重復(fù)只是程序欺騙了我們的雙眼。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Cloud Gateway Hystrix fallback獲取異常信息的處理

    Spring Cloud Gateway Hystrix fallback獲取異常信息的處理

    這篇文章主要介紹了Spring Cloud Gateway Hystrix fallback獲取異常信息的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot中MybatisX插件的簡單使用教程(圖文)

    SpringBoot中MybatisX插件的簡單使用教程(圖文)

    MybatisX 是一款基于 IDEA 的快速開發(fā)插件,方便在使用mybatis以及mybatis-plus開始時(shí)簡化繁瑣的重復(fù)操作,本文主要介紹了SpringBoot中MybatisX插件的簡單使用教程,感興趣的可以了解一下
    2023-06-06
  • Mybatis 逆向工程的三種方法詳解

    Mybatis 逆向工程的三種方法詳解

    這篇文章主要介紹了Mybatis 逆向工程的三種方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java設(shè)計(jì)模式之策略模式深入刨析

    Java設(shè)計(jì)模式之策略模式深入刨析

    策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-05-05
  • SpringBoot實(shí)現(xiàn)郵件發(fā)送功能的姿勢(shì)分享

    SpringBoot實(shí)現(xiàn)郵件發(fā)送功能的姿勢(shì)分享

    我們?cè)谌粘i_發(fā)中,經(jīng)常會(huì)碰到email郵件發(fā)送的場(chǎng)景,如發(fā)送驗(yàn)證碼,向客戶發(fā)送郵件等等,這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)郵件發(fā)送的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java常用JVM參數(shù)實(shí)戰(zhàn)

    Java常用JVM參數(shù)實(shí)戰(zhàn)

    本文主要介紹了Java常用JVM參數(shù)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring MVC 攔截器 interceptor 用法詳解

    Spring MVC 攔截器 interceptor 用法詳解

    這篇文章主要介紹了Spring MVC 攔截器 interceptor 用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Mybatis動(dòng)態(tài)SQL之IF語句詳解

    Mybatis動(dòng)態(tài)SQL之IF語句詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis動(dòng)態(tài)SQL之IF語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java中的Set集合源碼詳細(xì)解讀

    Java中的Set集合源碼詳細(xì)解讀

    這篇文章主要介紹了Java中的Set集合源碼詳細(xì)解讀,Set注重獨(dú)一無二的性質(zhì),該體系集合用于存儲(chǔ)無序(存入和取出的順序不一定相同)元素, 值不能重復(fù),需要的朋友可以參考下
    2023-11-11
  • Hadoop2.8.1完全分布式環(huán)境搭建過程

    Hadoop2.8.1完全分布式環(huán)境搭建過程

    本文搭建了一個(gè)由三節(jié)點(diǎn)(master、slave1、slave2)構(gòu)成的Hadoop完全分布式集群(區(qū)別單節(jié)點(diǎn)偽分布式集群),并通過Hadoop分布式計(jì)算的一個(gè)示例測(cè)試集群的正確性。對(duì)hadoop分布式環(huán)境搭建過程感興趣的朋友跟隨小編一起看看吧
    2019-06-06

最新評(píng)論