日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结

發布時間:2024/1/23 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一)HashMap的遍歷

HashMap的遍歷主要有兩種方式:

第一種采用的是foreach模式,適用于不需要修改HashMap內元素的遍歷,只需要獲取元素的鍵/值的情況。

HashMap myHashMap;

for (Map.entry item : myHashMap.entrySet()){

K key = item.getKey();

V val = item.getValue();

//todo with key and val

//WARNING: DO NOT CHANGE key AND val IF YOU WANT TO REMOVE ITEMS LATER

}

第二種采用迭代器遍歷,不僅適用于HashMap,對其它類型的容器同樣適用。

采用這種方法的遍歷,可以用下文提及的方式安全地對HashMap內的元素進行修改,并不會對后續的刪除操作造成影響。

for (Iterator> it = myHashMap.entrySet().iterator; it.hasNext();){

Map.Entry item = it.next();

K key = item.getKey();

V val = item.getValue();

//todo with key and val

//you may remove this item using "it.remove();"

}

(二)HashMap之刪除元素

如果采用第一種的遍歷方法刪除HashMap中的元素,Java很有可能會在運行時拋出異常。

HashMap myHashMap = new HashMap<>();

myHashMap.put("1", 1);

myHashMap.put("2", 2);

for (Map.Entry item : myHashMap.entrySet()){

myHashMap.remove(item.getKey());

}

for (Map.Entry item : myHashMap.entrySet()){

System.out.println(item.getKey());

運行上面的代碼,Java拋出了java.util.ConcurrentModificationException的異常。并附有如下信息。

at java.util.HashMap$HashIterator.nextNode(Unknown Source)

at java.util.HashMap$EntryIterator.next(Unknown Source)

at java.util.HashMap$EntryIterator.next(Unknown Source)

可以推測,由于我們在遍歷HashMap的元素過程中刪除了當前所在元素,下一個待訪問的元素的指針也由此丟失了。

所以,我們改用第二種遍歷方式。

代碼如下:

for (Iterator> it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry item = it.next();

//... todo with item

it.remove();

}

for (Map.Entry item : myHashMap.entrySet()){

System.out.println(item.getKey());

}

運行結果沒有顯示,表明HashMap中的元素被正確刪除了。

(三)在HashMap的遍歷中刪除元素的特殊情況

上述方法可能足以應付多數的情況,但是如果你的HashMap中的鍵值同樣是一個HashMap,假設你需要處理的是 HashMap, Double> myHashMap 時,很不碰巧,你可能需要修改myHashMap中的一個項的鍵值HashMap中的某些元素,之后再將其刪除。

這時,單單依靠迭代器的 remove() 方法是不足以將該元素刪除的。

例子如下:

HashMap, Integer> myHashMap = new HashMap<>();

HashMap temp = new HashMap<>();

temp.put("1", 1);

temp.put("2", 2);

myHashMap.put(temp, 3);

for (Iterator, Integer>>

it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry, Integer> item = it.next();

item.getKey().remove("1");

System.out.println(myHashMap.size());

it.remove();

System.out.println(myHashMap.size());

}

結果如下:

1

1

雖然 it.remove(); 被執行,但是并沒有真正刪除元素。

原因在于期望刪除的元素的鍵值(即 HashMap temp )被修改過了。

解決方案:

既然在這種情況下,HashMap中被修改過的元素不能被刪除,那么不妨直接把待修改的元素直接刪除,再將原本所需要的“修改過”的元素加入HashMap。

想法很好,代碼如下:

for (Iterator, Integer>>

it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry, Integer> item = it.next();

//item.getKey().remove("1");

HashMap to_put = new HashMap<>(item.getKey());

to_put.remove("1");

myHashMap.put(to_put, item.getValue());

System.out.println(myHashMap.size());

it.remove();

System.out.println(myHashMap.size());

}

但是依然是RE:

Exception in thread "main" java.util.ConcurrentModificationException

at java.util.HashMap$HashIterator.remove(Unknown Source)

原因在于,迭代器遍歷時,每一次調用 next() 函數,至多只能對容器修改一次。上面的代碼則進行了兩次修改:一次添加,一次刪除。

既然 java.util.ConcurrentModificationException 異常被拋出了,那么去想辦法拿掉這個異常即可。

最后的最后,我決定棄HashMap轉投ConcurrentHashMap。將myHashMap定義為ConcurrentHashMap之后,其它代碼不動。

運行結果如下:

2

1

最終,通過ConcurrentHashMap和一些小技巧的使用,變形實現了對被修改過鍵值的元素的刪除。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。