簡體   English   中英

hashmap獲取並發修改異常的問題

[英]issue with hashmap getting concurrent modification exception

使用地圖並執行一些刪除操作時出現以下錯誤。如何避免這種情況?

Caused by: java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
    at java.util.HashMap$EntryIterator.next(HashMap.java:834)
    at java.util.HashMap$EntryIterator.next(HashMap.java:832)


   Map<FormField, Object> ItemMap = domainItem.getValues();         
   for (Map.Entry<FormField, Object> ValMap : ItemMap.entrySet()) {         
       List<Field> groupIdList = Mapper.getGroupId(groupFieldId);           
       for (Field field : groupIdList) {
           ItemMap.put(new FormField(field), domainItem.getDomainItemLinkId());
       }
       ItemMap.remove(ValMap.getKey());
   }

更新:

使用Iterator和ConcurrentHashMap避免這種情況

跟隨不會拋出異常

    Map<Integer, String> map = new ConcurrentHashMap<Integer, String>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    map.put(4, "d");
    for (Iterator<Integer> keys = map.keySet().iterator(); keys.hasNext();) {
        Integer key = keys.next();
        String val = map.get(key);
        map.remove(key);
    }

或在迭代時使用其他地圖,最后將其復制到源

例如:

    Map<Integer, String> dummy = new HashMap<Integer, String>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    map.put(4, "d");
    dummy.putAll(map);
    for (Iterator<Integer> keys = dummy.keySet().iterator(); keys.hasNext();) {
        Integer key = keys.next();
        String val = map.get(key);
        map.remove(key);
    }
    System.out.println(map);

映射按鍵值對中的鍵排序。 當您遍歷地圖時在地圖中添加或刪除元素時,該程序實際上會失去對地圖中“位置”的跟蹤。

要解決此問題,請嘗試制作一個單獨的臨時傳輸地圖。 還有一個稱為Iterator的類,它可能適合您的需求。

避免此問題的一種方法是遍歷副本。

for (Map.Entry<FormField, Object> ValMap : 
     new HashMap<FormField, Object>(ItemMap).entrySet()) {

無需復制地圖即可完成操作,執行此示例,然后看一下代碼:

public static void main(String[] args)
  {

    System.out.println("creating map ...");

    Map<String, String> dummyMap = new HashMap<>();
    while (dummyMap.size() < 10)
    { dummyMap.put(String.valueOf(new Random().nextInt()), String.valueOf(new Random().nextInt())); }


    System.out.println("start, map size: " + dummyMap.size() + ", keys=" + dummyMap.keySet());


    System.out.print("going to remove: ");
    for (Iterator<String> keys = dummyMap.keySet().iterator(); keys.hasNext(); )
    {
      final String key = keys.next();

      // delete map entries per random
      if(new Random().nextInt(3)>1)
      {
        System.out.print(key+" ");
        keys.remove();
      }
    }
    System.out.print("\n");

    System.out.println("done, map size: " + dummyMap.size() + ", keys=" + dummyMap.keySet());
  }

看看這個類似的問題

HTH,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM