更新时间:2023-07-05 来源:黑马程序员 浏览量:
在使用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异常的发生。