首页 > 解决方案 > 为什么选择ConcurrentModificationException的设计标准只是结构修改

问题描述

我确实明白,只要在创建迭代器后对基础集合进行结构修改,就会引发 ConcurrentModificationExcpetion。这似乎是一个设计决定。

我想知道为什么 CME 不考虑通过 set() 方法进行更新?最终,集合正在更新,如果创建了迭代器,遍历仍然可能导致结果不一致。

标签: javacollectionsconcurrentmodificationdesign-decisions

解决方案


除非您实际参与制定设计决策,否则不可能知道设计决策的确切原因。

我推测原因可能是迭代器旨在迭代集合,而不是集合中的值

换句话说,迭代器就像一个“指针”,它将被移动以依次指向集合中的每个“空间”。通过在构造迭代器时了解集合的“形状”,您就知道如何移动指针以指向集合中的下一个空间。

如果存储在空间中的值发生变化,这并不重要:该空间和集合中的所有其他空间都保持不变。

但是,如果您通过结构修改来更改集合的形状,那么您基本上会使您对该指针指向的位置的任何假设无效;没有做一些非常聪明的事情,你还不如放弃并抛出异常。


推荐阅读