最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于java HashMap插入重復Key值問題

 更新時間:2023年03月22日 14:58:32   作者:山木枝  
這篇文章主要介紹了基于java HashMap插入重復Key值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java HashMap插入重復Key值

要在HashMap中插入重復的值,首先需要弄清楚HashMap里面是怎么存放元素的。

put方法

Map里面存放的每一個元素都是key-value這樣的鍵值對,而且都是通過put方法進行添加的,而且相同的key在Map中只會有一個與之關聯(lián)的value存在。put方法在Map中的定義如下。

V put(K key, V value);

put()方法實現:

首先hash(key)得到key的hashcode(),hashmap根據獲得的hashcode找到要插入的位置所在的鏈,在這個鏈里面放的都是hashcode相同的Entry鍵值對,在找到這個鏈之后,會通過equals()方法判斷是否已經存在要插入的鍵值對,而這個equals比較的其實就是key。

它用來存放key-value這樣的一個鍵值對,返回值是key在Map中存放的舊value,如果之前不存在則返回null。HashMap的put方法是這樣實現的。

// 在此映射中關聯(lián)指定值與指定鍵。如果該映射以前包含了一個該鍵的映射關系,則舊值被替換
public V put(K key, V value) {
? ? // 當key為null,調用putForNullKey方法,保存null與table第一個位置中,這是HashMap允許為null的原因?
? ? if (key == null)
? ? ? ? return putForNullKey(value);
? ? // 使用hash函數預處理hashCode,計算key的hash值 ?
? ? int hash = hash(key.hashCode());//-------(1)
? ? // 計算key hash 值在 table 數組中的位置?
? ? int i = indexFor(hash, table.length);//------(2)
? ? // 從i出開始迭代 e,找到 key 保存的位置
? ? for (Entry<K, V> e = table[i]; e != null; e = e.next) {
? ? ? ? Object k;
? ? ? ? // 判斷該條鏈上是否有hash值相同的(key相同)?
? ? ? ? // 若存在相同,則直接覆蓋value,返回舊value?
? ? ? ? if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
? ? ? ? ? ? // 舊值 = 新值 ?
? ? ? ? ? ? V oldValue = e.value;
? ? ? ? ? ? // 將要存儲的value存進去
? ? ? ? ? ? e.value = value;
? ? ? ? ? ? e.recordAccess(this);
? ? ? ? ? ? // 返回舊的value
? ? ? ? ? ? return oldValue;
? ? ? ? }
? ? }
? ? // 修改次數增加1?
? ? modCount++;
? ? // 將key、value添加至i位置處?
? ? addEntry(hash, key, value, i);
? ? return null;
}

從上我們可以看到在添加對應的key-value這樣的組合時,如果原本已經存在對應的key,則直接改變對應的value,并返回舊的value,而在判斷key是否存在的時候是先比較key的hashCode,再比較相等或equals的。

直接從上面代碼來看是比較的對應Map.Entry的hashCode和key的hashCode,而實際上Map.Entry的hashCode其實就是其存放key的hashCode。

而如果對應的key原本不存在的話將調用addEntry將對應的key-value添加到Map中。

addEntry傳遞的參數hash就是對應key的hashCode。

實現引用對象作為keys的唯一性

通過對put()方法的研究,我們可以發(fā)現,判斷key是否存在的時候是先比較key的hashCode,再比較相等或equals的,所以重寫hashCode()和equals()方法即可實現覆蓋keys的引用(指向具有相同實例變量的對象)。

class MyType {
? ? private String arga;
? ? private String argb;

? ? public MyType(String arga, String argb) {
? ? ? ? this.arga = arga;
? ? ? ? this.argb = argb;
?? ?}

?? ?@Override
?? ?public int hashCode(){ ? ? ? ? ? ? ? ??
?? ? ? ? return this.arga.hashCode() * this.argb.hashCode() ;?
?? ?}?
?? ?
?? ?@Override
?? ?public boolean equals(Object obj) { ??
?? ? ? ?if (this == obj) { ? ? ? ? ? ? ??
?? ? ? ? ? ?return true; ? ? ? ? ? ? ? ? ?
?? ? ? ?} ? ? ? ??
?? ? ? ?if (!(obj instanceof MyType)) { ?
?? ? ? ? ? ?return false; ? ? ? ? ? ? ??
?? ? ? ?} ? ?
?? ??? ?MyType p = (MyType) obj; ?
?? ??? ?if (this.arga.equals(p.arga) && this.argb.equals(p.argb)) { ? ? ? ? ? ? ?
?? ? ? ? ? ?return true ; ? ? ? ? ? ? ? ? ?
?? ? ? ?} else { ? ? ? ? ??
?? ? ? ? ? ?return false ; ? ? ? ? ? ? ? ?
?? ? ? ?} ? ? ??
?? ?}
}

重寫這兩個方法之后就可以覆蓋重復的引用對象,如果需要對value進行疊加,調用put()方法之前用containsKey()方法判斷是否有重復的鍵值,如果有,則用get()方法獲取原有的value,再加上新加入的value即可。

HashMap解決key值相同問題

某些場景需要一個key值下面對應多個值,但是map的一個key值只對應一個value值,由于hashmap相同的key值,第二個put進去會覆蓋第一個的值,所以為了解決這一問題:所以用list存

如下:

List<Map<String, List<RecommendationListBO>>> hashList = new ArrayList<>();
Iterator<Map.Entry<String, List<RecommendationListBO>>> iterator = recommendationHashMap.entrySet().iterator();
Map.Entry<String, List<RecommendationListBO>> entry;
while (iterator.hasNext()) {
? ? entry = iterator.next();
? ? // 往newMap中放入新的Entry
? ? HashMap<String, List<RecommendationListBO>> newMap = new LinkedHashMap<>();
? ? newMap.put(entry.getKey().split(",")[0], entry.getValue());
? ? hashList.add(newMap);
}

每次new一個新的map,add到map的list里面。思路大概是這樣的。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java連接HBase,連接不上報錯can not resolve問題及解決

    java連接HBase,連接不上報錯can not resolve問題及解決

    這篇文章主要介紹了java連接HBase,連接不上報錯can not resolve問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring的@RequestParam對象綁定方式

    Spring的@RequestParam對象綁定方式

    這篇文章主要介紹了Spring的@RequestParam對象綁定方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于java計算買賣股票的最佳時機

    基于java計算買賣股票的最佳時機

    這篇文章主要介紹了基于java計算買賣股票的最佳時機,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java如何設置系統(tǒng)參數和運行參數

    Java如何設置系統(tǒng)參數和運行參數

    這篇文章主要介紹了Java如何設置系統(tǒng)參數和運行參數,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java樹形結構遞歸查詢方式

    Java樹形結構遞歸查詢方式

    文章介紹了Java中實現樹形結構遞歸查詢的方法,首先找出所有的根節(jié)點,然后通過循環(huán)遍歷根節(jié)點,找到每個根節(jié)點的子節(jié)點,最終構建完整的樹形結構,這是一種有效的遞歸查詢思路,適用于需要層次化展示數據的場景
    2024-12-12
  • SpringBoot中@ConditionalOnProperty注解的使用方法詳解

    SpringBoot中@ConditionalOnProperty注解的使用方法詳解

    這篇文章主要介紹了SpringBoot中@ConditionalOnProperty注解的使用方法詳解,在開發(fā)基于SpringBoot框架的項目時,會用到下面的條件注解,有時會有需要控制配置類是否生效或注入到Spring上下文中的場景,可以使用@ConditionalOnProperty注解來控制,需要的朋友可以參考下
    2024-01-01
  • java.lang.Long cannot be cast to java.lang.Integer數據類型轉換異常解決辦法

    java.lang.Long cannot be cast to ja

    本文主要介紹了java.lang.Long cannot be cast to java.lang.Integer數據類型轉換異常解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • springboot學習之構建簡單項目搭建步驟詳解

    springboot學習之構建簡單項目搭建步驟詳解

    這篇文章主要介紹了springboot學習之構建簡單項目搭建步驟詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Java使用I/O流讀取文件內容的方法詳解

    Java使用I/O流讀取文件內容的方法詳解

    這篇文章主要介紹了Java使用I/O流讀取文件內容的方法,結合實例形式詳細分析了java使用I/O流讀取文件常見操作技巧,需要的朋友可以參考下
    2019-11-11
  • Java四種遍歷Map的方法

    Java四種遍歷Map的方法

    今天小編就為大家分享一篇關于Java四種遍歷Map的方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

广州市| 洪泽县| 唐河县| 盱眙县| 兴城市| 噶尔县| 柳河县| 无极县| 容城县| 桂东县| 密云县| 卓资县| 肇东市| 惠州市| 西宁市| 镇沅| 虎林市| 南雄市| 台湾省| 平泉县| 静乐县| 塔城市| 安新县| 公主岭市| 阳新县| 茶陵县| 响水县| 重庆市| 韶关市| 海口市| 南丰县| 博客| 潢川县| 榆中县| 新丰县| 来宾市| 正宁县| 鹤壁市| 陈巴尔虎旗| 宣恩县| 迭部县|