当前位置: 首页 > 面试题库 >

不可修改集合中的ConcurrentModificationException

酆奇文
2023-03-14
问题内容

我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException:

filterCardsToDevice(getCollection());

代码:

private List<MyClass> filterCardsToDevice(Collection<MyClass> col) {
    final List<MyClass> newList = new ArrayList<MyClass>();

    for (MyClass myObj : col) {
        long id = myObj.getId();
        if (id < 0 || id > 0xFFFFFFFFl) {
            // just a log here
        } else {
            newList.add(myObj);
        }
    }

    return newList;
}

private final Map<Long, MyClass> map = new HashMap<Long, MyClass>();

public Collection<MyClass> getCollection() {
    synchronized (map) {
        return Collections.unmodifiableCollection(map.values());
    }
}

堆栈是:

at java.util.HashMap$HashIterator.nextEntry(HashMap.java:841)                 
at java.util.HashMap$ValueIterator.next(HashMap.java:871)                 
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1010)

恰好在foreach行上:

for (MyClass myObj : col) {

我不明白为什么会发生此错误,因为我没有修改列表。


问题答案:

要知道,Collections.unmodifiable*不是抄袭
收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。

如果要创建真正独立的不可修改的集合实例:

Collections.unmodifiableCollection(new ArrayList<>(map.values()));


 类似资料:
  • 问题内容: 假设我有一个Integer列表,并且我在列表上使用Java 8 forEach方法将其值加倍。说我有以下代码: 至于forEach方法,请使用Consumer并调用它接受方法。我在上面的代码运行后打印列表,原始列表没有变化。 据我了解,Stream不会改变源,但在这里我只是在每个元素上调用accept方法。 谢谢你在advace 问题答案: forEach不更改列表的原因归结为规范:

  • 尝试添加到集合时出现“Collection was modified”异常 问题出在“添加”方法上。如果我注释掉该部分,则不会引发异常。重要的是要注意,我已经尝试将foreach重写为for循环并添加“ToList()”以形成。链接。在所有情况下都会引发相同的异常。我在站点的其他部分使用这种完全相同的模式没有问题,这就是为什么这如此令人沮丧。这也适用于“创建”。问题只影响“编辑”操作。 其他相关代

  • 本文向大家介绍Objective C中可修改和不可以修改类型。相关面试题,主要包含被问及Objective C中可修改和不可以修改类型。时的应答技巧和注意事项,需要的朋友参考一下 答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。 比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存

  • 我知道这在生产中绝不应该发生,但我正在试图理解一些关于spliterator的错综复杂的细节,并撞见了下面这个“谜题”(至少对我来说是个谜题): (代码段%1) 这段代码按预期打印(cough我已经预期了一个,但我理解行为cough),即,它在列表上创建了一个拆分器,当列表有6个元素时,该拆分器将被拆分。 我不明白的是以下几点: (片段2) 我预计这段代码会失败,但它确实失败了,因为在的行上有一个

  • 问题内容: 我试图设置一个不可修改的。 在我的代码中,我有一个返回列表的方法。 此列表不应该修改,但我不想捕获unmodifiableList返回的异常。 它是现有代码,我必须对其进行转换以返回不可修改的列表,但是如果调用了“ add”方法,则不必捕获任何异常。 首先,我创建一个类,该类实现List来覆盖“ add”方法以记录异常而不是捕获异常。 但是我不知道如何正确地实例化它。 问题答案: 如果

  • 我正在从一个可观察的列表中设置一个ListView,该列表有另一个集合的输入(在本例中是一个链表)。因此,我在这个答案中找到了如何使列表视图的项从中移除(我不太确定它们是否也从ObservableList中移除),那么还有什么可能的方法可以在两个集合(即ObservableList和原始集合)中进行修改呢? 下面是一段代码: