为什么Java必须抛出并发修改异常?

Cri*_*ter 0 c++ java iterator exception

我想知道Java的迭代器.为什么它们被设计为抛出并发修改异常?在C++ STL中,您可以遍历容器并随意修改内容,但为什么不能在Java中执行此操作?

编辑:更正的问题.框架不正确.

Lou*_*man 5

下面是一个例子,说明当你迭代它时尝试修改列表时迭代器会抛出的原因.

假设您的迭代器是使用索引实现的,例如ArrayList:让我们说你的迭代器现在指向List右边的位置3 .现在你在位置添加一个元素1.迭代器不知道你做了什么改变,所以它仍然指向位置3,但是位置3现在保持了曾经位于第2位的元素,因为一切都向下移动了.所以你的迭代器现在将访问一个元素两次!那很糟.

所以规则是当你在迭代它时修改一个列表时,你必须从迭代器本身这样做,所以迭代器知道如何保持它的位置与列表的修改同步.如果您在不经过迭代器的情况下修改列表,则迭代器会抛出ConcurrentModificationException而不是静默地损坏,例如多次访问元素.