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

ConcurrentModificationException异常

晏永康
2023-03-14
问题内容

我有一个方法test(),其中我试图将两个LinkedHashMap相互比较,并通过删除键/值对(如果在两个LHM中都找到)来修改其中一个映射的内容。运行此方法时,我不断收到ConcurrentModificationException。我知道为什么会收到异常(因为我正在尝试修改正在循环的列表)。我不确定如何进行此操作。到目前为止,我有以下代码:

private void test() {

LinkedHashMap<String, BigDecimal>testBene = new LinkedHashMap<String, BigDecimal>();
LinkedHashMap<String, BigDecimal>testDly = new LinkedHashMap<String, BigDecimal>();

testBene.put("ABCDEFG", BigDecimal.ZERO);
testBene.put("BCDEFGH", BigDecimal.ONE);
testBene.put("CDEFGHI", BigDecimal.TEN);

testDly.put("BCDEFGH", BigDecimal.ONE);
testDly.put("Foo", BigDecimal.TEN);
testDly.put("Bar", BigDecimal.TEN);

for (Entry<String, BigDecimal> beneKeySet : testBene.entrySet()) {
    if (testDly.containsKey(beneKeySet.getKey())) {
        for (Entry<String, BigDecimal> dlyKeySet : testDly.entrySet()) {
            if ((dlyKeySet.getKey().equals(beneKeySet.getKey())) && 
                dlyKeySet.getValue().equals(beneKeySet.getValue())) {
                    testBene.remove(dlyKeySet.getKey());
            }
        }
    }
}

}

问题答案:

您可以使用迭代器:

for (Iterator<Entry<String, BigDecimal>> it = testBene.entrySet().iterator(); it.hasNext();) {
    Entry<String, BigDecimal> beneKeySet = it.next();
    if (testDly.containsKey(beneKeySet.getKey())) {
        for (Entry<String, BigDecimal> dlyKeySet : testDly.entrySet()) {
            if ((dlyKeySet.getKey() == beneKeySet.getKey()) && dlyKeySet.getValue() == beneKeySet.getValue()) {
                it.remove();
            }
        }
    }
}


 类似资料:
  • 问题内容: 我有以下代码,我希望它抛出,但运行成功。为什么会这样? 问题答案: 的上方法删除指定位置的元素。在开始循环之前,您的列表如下所示: 然后,在列表上启动迭代器: 您的环然后删除 位置1处的元件 ,这是数字2: 在下一个隐式调用上,迭代器返回,然后循环终止。 如果将更多元素添加到列表中,则会得到一个。然后隐式将抛出。 请注意,从Javadoc 到JCF: 注意,迭代器的快速失败行为无法得到

  • 问题内容: 我正在尝试按时间范围的开始时间排序列表(用开始时间和结束时间表示为Time []数组)。我正在尝试使用以下嵌套循环来做到这一点: 但它在行上抛出了一个(顶部的那个)。我以前从未见过这种例外情况,有人可以向我解释它的含义和原因。 我也愿意为此提出更好的算法建议。 问题答案: workingList.remove(compareTo); 您在迭代时正在修改集合。 您应该使用类似: 也有一些

  • 问题内容: 那是我收到的错误。 我的方法看起来像 所以我的理解是,这意味着我要在迭代器完成之前更改其大小,这就是您得到的错误。这是正确的,因为reactStateChange之一是用于将对象从hashMap中移除。如何安全地执行此操作,以便在删除某些内容时可以让Iterator提前知道,从而可以避免此错误。提前致谢。如果需要更多详细信息,我们将很高兴满足您的要求。 问题答案: 从基础集合中删除元素

  • 问题内容: 我正在使用以下代码测试集合: 我不明白为什么删除“ b”可以,但是其他NG? 问题答案: 首先要知道的是(如JLS所述)以下增强的for循环: 等效于: 如果查看中的迭代器的实现,您将看到: 不检查并发修改,仅使用大小检查我们是否在列表的末尾: 首先要做的是调用以查看在迭代过程中列表是否被修改: 因此,当您迭代并删除列表的倒数第二个元素时,下一条指令将是对的调用,该调用将返回,因为删除

  • 问题内容: 我有以下代码: 当我尝试运行它时,我得到了,即使代码在同一线程中运行,没有人能解释为什么会发生吗?我该如何避免呢? 问题答案: 如果使用循环浏览列表,则无法从列表中删除。你可以使用。更换: 带有:

  • 问题陈述:为以下场景设计系统: 1.物料列表包含多个物料的物料编码、名称、费率和数量。 每当在列表中添加新项目时,都要检查项目编码的唯一性。用新产品的价格注册一个新产品。 项目的时间比率可能会更改。 每当发出或接收一个项目时,检查该项目的存在性并更新数量。 出库时,还要检查数量的可用性。 用户可能还想知道一个项目的价格/数量。 查找多少项目的成本超过给定金额。金额将是一个参数。 请记住,如果给出了