为什么java concurrentmodificationexception影响ArrayList而不是标准数组?

为什么java concurrentmodificationexception影响ArrayList而不是标准数组?,java,concurrentmodification,Java,Concurrentmodification,不久前我在一个博客上看到,如果您在concurrentmodificationexception方面遇到问题,请将arraylist转换为常规数组[],您会没事的。但它没有解释 这是为什么?该类的迭代器和listIterator方法返回的迭代器故障很快:如果在创建迭代器后的任何时候,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出一个ConcurrentModificationException 请注意,此异常并不表示对象已被其他线程同时修改。即使有一个线程违

不久前我在一个博客上看到,如果您在
concurrentmodificationexception
方面遇到问题,请将arraylist转换为常规数组[],您会没事的。但它没有解释

这是为什么?

该类的迭代器和listIterator方法返回的迭代器故障很快:如果在创建迭代器后的任何时候,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出一个
ConcurrentModificationException

请注意,此异常并不表示对象已被其他线程同时修改。即使有一个线程违反了对象的约定,也会引发异常

在Java中,当试图在迭代器外部修改集合对象
(例如Java.util.List)
时,可能会发生ConcurrentModificationException。文档指出线程是一个可能的原因,但即使在进行单线程编程时也会出现此异常

下面的代码抛出一个
ConcurrentModificationException
,尽管它是在单个线程中执行的

List<String> mylist = new ArrayList<String>();
mylist.add("one");
Iterator<String> iterator = mylist.iterator();
while( iterator.hasNext() ) {
  iterator.next();
  mylist.remove(0);  // throws the exception
}
相关错误是非法状态异常。如果在remove()之后不推进迭代器,可能会发生这种情况


使迭代器指针保持最新,使用
next()或remove()
一次操作一个元素;这来自当您
数组列表中添加
删除
元素时,您正在更改其结构。这将使在此更改之前初始化的任何
迭代器无效

另一方面,数组没有真正的迭代器
myArray[i]=myValue
只是一个赋值-它对数组的结构没有任何影响,与任何其他赋值一样是原子的

IllegalStateException
iterator.next();
iterator.remove();
iterator.remove();  // will throw the error