易错问题

来源:互联网 发布:网络棋牌平台杀分 编辑:程序博客网 时间:2024/05/17 23:47

1 遍历一个ArrayList去查找某项是否存在,如果存在的话就从列表中删除,方法如下:

  1. for(Person p : persons){ 
  2.         if(p.getName().equals(name)) 
  3.         persons.remove(p); 
  4. }
for(Person p : persons){         if(p.getName().equals(name))         persons.remove(p); }

结果出现java.util.ConcurrentModificationException错误

原因: jdk5.0以上的for-each也是利用内部的iterator来遍历集合的(跟以前的iterator一样)获得的Iterator是一个内部类产生的迭代器,这个迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。进一步说,当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运xi,java.util.ConcurrentModificationException 异常也将被抛出。Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。  所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

  Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。



解决方法1: 

  1. //使用java.util.Iterator 
  2. for(Iterator it = list.iterator(); it.hasNext();){  
  3.         Integer i = (Integer)it.next(); 
  4.         it.remove(); 
  5. }
//使用java.util.Iterator for(Iterator it = list.iterator(); it.hasNext();){          Integer i = (Integer)it.next();         it.remove(); }

解决方法2:

 
  1. for(int i = 0; i<persons.size(); i++){ 
  2.     if(persons.get(i).getName().equals(name)) 
  3.         persons.remove(i); 
  4. }
for(int i = 0; i<persons.size(); i++){     if(persons.get(i).getName().equals(name))         persons.remove(i); }

方法2不适合大型数组

原创粉丝点击