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

标签 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);
}

问题 1:- 那么我可以说增强 for 循环也在内部使用 fail-fast 迭代器吗?虽然当我执行下面的代码时它工作正常

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

问题 2:- 另一个问题是 when statement say

if a thread modifies a a collection

我的猜测是,这里的修改指的是删除或添加,而不是针对 list 接口(interface)更新 collection 内的元素,同时它还包括针对 set 接口(interface)修改元素。正确的?至少我试过的程序是这样的。

编辑

关于集合,我怀疑我上面的说法,即当我们在迭代时尝试修改集合时,它会抛出并发修改异常。我尝试了下面的代码,但它没有抛出任何异常

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);

}

理想情况下,如果集合在创建迭代器后的任何时间被修改,则按照语句 http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html它应该抛出并发修改异常,但它没有。不确定为什么?

最佳答案

Question1:- So can i say enhance for loop also uses the fail-fast iterator internally?Though when i execute below code it works fine

是的,没错。查看编译后的代码,如果您愿意,可以使用 javap 命令来验证这一点。

My guess is that modification means here removal or addition not for updation of element inside collection for list interface while it also includes modification of element for set interface . Right? Atleast the programmes i tried it is the case with them.

没错,如果您执行 emp1.setEmpId(2) 或类似操作,迭代将不会失败。

...it should throw the concurrent modification exception but it did not . Not sure why?

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

关于java - 迭代时修改集合中元素的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372422/

相关文章:

java - keyCode if/else 命令

java - 消息级 Jax-WS 服务

java - 如何围绕未正确发布的值展示竞争条件?

java - 使用 Intellij IDEA 的代码样式

java - Docker重启-保留环境变量

java - Spark - Java - 在不使用 Spark SQL 数据帧的情况下创建 Parquet/Avro

java - 如何在java中将HashMap<String, ArrayList<MyClass>>转换为ArrayList<MyClass>?

java - 如何在 Java 中跟踪电子邮件?

java - 如何为 6、6.6 和 6.6.6 等过滤器定义正则表达式?

java - 使自定义对象可转换