首页常见问题正文

HashMap为什么不能一边遍历一遍删除?

更新时间:2023-07-05 来源:黑马程序员 浏览量:

IT培训班

  在使用HashMap进行遍历和删除操作时,不能在遍历过程中直接删除元素,这是因为HashMap的迭代器设计不支持在遍历时对集合进行结构性修改。当在遍历过程中直接删除元素时,会导致迭代器的状态与实际集合的状态不一致,可能引发ConcurrentModificationException(并发修改异常)。

  具体来说,当创建HashMap的迭代器时,会生成一个"modCount"字段,表示HashMap结构性修改的次数。每当对HashMap进行插入、删除等操作时,"modCount"都会增加。而在迭代器遍历HashMap时,会将当前的"modCount"与之前保存的"expectedModCount"进行比较,如果两者不相等,则会抛出ConcurrentModificationException。

  下面我们看一个简单的代码示例,演示了在遍历HashMap过程中删除元素可能导致的异常:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashMapDemo {
    public static void main(String[] args) {
        Map<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "A");
        hashMap.put(2, "B");
        hashMap.put(3, "C");

        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            if (key == 2) {
                hashMap.remove(key); // 在遍历过程中直接删除元素
            }
        }
    }
}

  在上述代码中,尝试在遍历HashMap时删除元素,当删除key为2的元素时,会抛出ConcurrentModificationException异常。

  为了避免这种异常,可以通过使用迭代器的remove()方法进行安全的删除操作。下面是修改后的代码示例:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashMapDemo {
    public static void main(String[] args) {
        Map<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "A");
        hashMap.put(2, "B");
        hashMap.put(3, "C");

        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            if (key == 2) {
                iterator.remove(); // 使用迭代器的remove()方法删除元素
            }
        }
    }
}

  在修改后的代码中,使用了迭代器的remove()方法进行删除操作,这样可以避免ConcurrentModificationException异常的发生。

分享到:
在线咨询 我要报名
和我们在线交谈!