使用 Set 时出现 ConcurentModificationException

ConcurentModificationException when using Set

运行时指示在给定 temp = keysit.next() 时发生异常。我认为当我第二次重新定义 keysit = keys.iterator() 时已经解决了这个问题,但也许我错过了重点。有什么建议吗?

Map<Integer, Set<String>> lhm = new LinkedHashMap<Integer, Set<String>>();

public void sortMap() {
    Set<Integer> keys = hm.keySet();
    Iterator<Integer> keysit;
    int iterations = keys.size();
    int smallest;
    int temp;
    for(int i=0; i<iterations; i++) {
        keysit = keys.iterator();
        smallest = keysit.next();
        keysit = keys.iterator();  
        while(keysit.hasNext()) {
            temp = keysit.next();  
            if(temp<smallest) 
                smallest = temp;
            lhm.put(smallest, lhm.get(smallest));
            keys.remove(smallest);
        }
    }
    System.out.println(lhm);
}

使用 Concurrenthashmap 而不是 hashmap 或 map bcoz hashmap 不是线程安全的

重点是迭代器维护一个名为 - modCount 的整数标志,它在迭代期间跟踪修改。

在下面的代码行中

keys.remove(smallest);

您实际上是从集合中删除元素,这会更改此 modcount。因此下次调用 next() 获取下一个元素时,它会检查 modcount 值是否已更改。如果是则抛出并发修改异常。

所以总而言之,修改取决于 modcount 标志,而不取决于您重新定义了多少次 keys.iterator()。

一个好的选择是按照@Olu

的建议使用 ConcurrentHashMap