返回了ConcurrentModificationException,从地图上删除了一个条目,但我看不到出了什么问题。

    Iterator<String> mapIterator = this.attributeMap.keySet().iterator();
    while (mapIterator.hasNext())
    {
        String attributeName = mapIterator.next();
        if (attributeName.matches(pattern))
        {
            mapIterator.remove();
        }
    }

最佳答案

在这种情况下,
    mapIterator.next()
抛出ConcurrentModificationException

其背后的原因是:
有一个int变量modCount,它提供了更改列表大小的次数,此值在每个next()调用中用于检查函数checkForComodification()中是否有任何修改。如果mapIterator.next()在迭代对象中的modCount中发现更改,则它将抛出ConcurrentModificationException

为避免这种情况,请遵循以下几点:


您可以将列表转换为数组,然后在数组上进行迭代。这种方法适用于中小型列表,但是如果列表很大,则对性能的影响很大。
您可以通过将列表放在同步块中来在锁定时锁定列表。不建议使用此方法,因为它将停止多线程的好处。
如果使用的是JDK1.5或更高版本,则可以使用ConcurrentHashMap和CopyOnWriteArrayList类。这是推荐的方法。

09-04 17:26