使用hashmap迭代器时插入元素
时间: 2025-03-29 16:16:09 浏览: 32
在 Java 中,`HashMap` 的迭代过程中如果直接修改集合(例如插入新元素),会导致 `ConcurrentModificationException` 异常。这是因为默认的迭代器是非线程安全的,并且检测到了结构化修改(即添加、删除键值对等操作)。
但是,有一种特殊情况允许我们在迭代时进行修改——通过使用 **Iterator** 提供的内置方法 `remove()` 来移除元素。然而,对于插入元素的操作,则无法通过 Iterator 直接完成。
如果你确实需要在遍历 HashMap 期间动态插入新的键值对,推荐的做法包括以下几种:
### 方法一:先收集待插入的数据再统一处理
可以在第一次完整迭代完成后才执行真正的更新动作。
```java
Map<String, Integer> map = new HashMap<>();
// 初始化...
List<Map.Entry<String, Integer>> entriesToAdd = new ArrayList<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// 根据条件判断是否新增条目
if (...) {
entriesToAdd.add(new AbstractMap.SimpleEntry<>("newKey", newValue));
}
}
entriesToAdd.forEach(e -> map.put(e.getKey(), e.getValue()));
```
### 方法二:采用支持并发修改的数据结构如 ConcurrentHashMap
如果频繁发生增删改查的需求,考虑更换成更高级别的容器类 `ConcurrentHashMap` ,它内部实现了分段锁策略或其他优化手段使得能一定程度上允许多线程环境下同时读写而不报错。
示例代码:
```java
ConcurrentHashMap<String,Integer> concurrentHashMap=new ConcurrentHashMap<>();
concurrentHashMap.put("a",1);
concurrentHashMap.put("b",2);
for(String key:concurrentHashMap.keySet()){
System.out.println(key+"="+concurrentHashMap.get(key));
// 插入不会抛异常
if(concurrentHashMap.size()<5){
int nextValue=concurrentHashMap.size()+1;
String nextKey="c"+nextValue;
concurrentHashMap.put(nextKey,nextValue);
}
}
```
注意:尽管如此,仍需小心避免死循环等问题!
---
阅读全文
相关推荐




















