HashMap为何不能一边遍历一遍删除

  • 原因
    在 Java 中,在遍历 HashMap 的同时删除元素会导致并发修改异常 (ConcurrentModificationException)。这是因为 HashMap 在内部使用了迭代器来遍历,而迭代器是不允许在遍历过程中修改集合的。

  • 解决方案
    方案一:
    使用 Iterator 的 remove() 方法删除元素,而不是直接在 HashMap 上使用 remove() 方法,如:

    Iterator> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
    Map.Entry entry = iterator.next();
    if (entry.getKey().equals(keyToRemove)) {
      iterator.remove();
    }
    }
    

    方案二:
    使用一个临时的容器,将要删除的元素存储起来,遍历完后再删除,如:

    List keysToRemove = new ArrayList<>();
    for (Map.Entry entry : map.entrySet()) {
    if (entry.getKey().equals(keyToRemove)) {
      keysToRemove.add(entry.getKey());
    }
    }
    for (Integer key : keysToRemove) {
    map.remove(key);
    }
    

    方案三:
    使用 Java 8 中的 Stream API,如:

    map.entrySet().removeIf(entry -> entry.getKey().equals(keyToRemove));
    
请使用浏览器的分享功能分享到微信等