迭代时修改集合中元素的概念?

M S*_*ach 8 java

我找到了这个语句,如果一个线程在用一个失败快速的迭代器迭代集合时直接修改了一个集合,迭代器就会抛出这个异常.在http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html.

我发现下面的代码中甚至会抛出并发修改

List<Employee> lista= new ArrayList();
Employee emp1=new Employee();
Employee emp2=new Employee();
Employee emp3=new Employee();
lista.add(emp1);
lista.add(emp2);
lista.add(emp3);
for(Employee emp:lista)
{
emp2.setEmpId(2);
lista.remove(emp2);
}
Run Code Online (Sandbox Code Playgroud)

问题1: - 所以我可以说增强循环也在内部使用失败快速迭代器吗?虽然当我执行下面的代码它工作正常

for(int i=0;i<lista.size();i++)
{
Employee empTemp=lista.get(i);
lista.remove(emp2);         
}
Run Code Online (Sandbox Code Playgroud)

问题2: - 另一个问题是声明时说

如果一个线程修改了一个集合

我的猜测是修改意味着删除或添加不是为了更新列表接口的集合内的元素,同时它还包括对set接口的元素的修改.对?至少我试过的程序是他们的情况.

编辑

关于set我怀疑我的上述语句,即当我们尝试在迭代时修改set时它抛出并发修改异常.我尝试了下面的代码,但它没有抛出任何异常

HashSet<Employee> set1= new HashSet();
Employee emp4=new Employee();
Employee emp5=new Employee();
Employee emp6=new Employee();
set1.add(emp4);
set1.add(emp5);
set1.add(emp6);


Iterator iter1=set1.iterator();
while(iter1.hasNext())
{
Employee emp12=(Employee)iter1.next();
System.out.println("");
emp5.setEmpId(2);

}
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果在http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html上创建迭代器之后的任何时间修改了集合, 那么它应该抛出并发修改异常但事实并非如此.不知道为什么?

aio*_*obe 11

问题1: - 所以我可以说增强循环也在内部使用失败快速迭代器吗?虽然当我执行下面的代码它工作正常

恩,那就对了.查看已编译的代码,javap如果您愿意,可以使用命令验证这一点.

我的猜测是修改意味着删除或添加不是为了更新列表接口的集合内部元素,而它还包括修改set接口的元素.对?至少我试过的程序是他们的情况.

这是正确的,如果你做emp1.setEmpId(2)或类似的事情,迭代不会失败.

...它应该抛出并发修改异常,但它没有.不知道为什么?

它只会在您修改列表时抛出异常.请记住,该列表包含对象的引用.如果修改对象,则引用不会更改,因此列表不会更改.