java Iterator遍历集合 Java ConcurrentModificationException

Itertor接口

看集合主要成员图(java集合中)可知Itertor接口不在图上,但是他也是集合框架的成员,但是它与Map集合系列,Collection集合系列不同,它主要装的是遍历Collection集合里的元素。Itertor对象也叫迭代器,依托Collection对象存在。提供遍历Collection的统一编程接口。

主要的方法:

boolean hasNext() 要是被遍历的集合还没遍历完,就返回true

Object next() 返回集合里的下一个元素

void remove() 删除上一次next()返回的元素

复制代码
package Test01;
  
 
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
  
public class Test {
  
    public static void main(String[] args) {
        Collection  arr = new HashSet<>();
        arr.add("a");
        arr.add("b");
        arr.add("C");//可以添加重复的对象
        Iterator  iterator =arr.iterator();
        while(iterator.hasNext()) {
         String next =     (String) iterator.next();
         System.out.println(next);
         if(next.equals("C")) {
             iterator.remove();
         } 
         next ="修改迭代变量的值看看有没影响";    //注意下
        }
       
    System.out.println(arr.toString());
     }
}
复制代码

运行完发现“注意下”的地方本想改变集合里的元素却没变。所以可得到:Iterator并不是得到集合本身的元素,而是得到元素的值而已,所以修改迭代变量的值并不会影响集合本身。

Iterator不像其他集合,没有承装对象的能力。如果他不依托集合存在,根本没存在的价值。

想删除集合元素,必须通过Iterator的remove() 删除上一次next()返回的元素,不能集合自己remove(Object)

举例,会发现异常

扫描二维码关注公众号,回复: 1851257 查看本文章
复制代码
package Test01;
  
 
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
  
public class Test {
  
    public static void main(String[] args) {
        Collection  arr = new HashSet<>();


        arr.add("a");


        arr.add("b");


        arr.add("C");//可以添加重复的对象
        Iterator  iterator =arr.iterator();
        while(iterator.hasNext()) {
         String next =     (String) iterator.next();
         System.out.println(next);
         if(next.equals("b")) {
             arr.remove(next);
         } 
         next ="修改迭代变量的值看看有没影响";
        }
       
    System.out.println(arr.toString());
     }
}
复制代码

异常原因是 迭代器采用快速-失败原则(fast-fail),一旦迭代过程中发现Collection集合中元素被修改,就引发异常。偶尔发现,如果刚刚代码改成

if(next.equals("C")) {

             arr.remove(next);
         }

也不会异常,----只有删除特定元素才会这样,但是不该冒险去做。

foreach也能迭代访问集合,但是注意,他得到的也不是集合元素本身,系统只是把集合元素的值赋给迭代变量而已,也同样同上会引发Java ConcurrentModificationException异常。

如下代码(错误示范)

复制代码
package Test01;
  
 
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
  
public class Test {
  
    public static void main(String[] args) {
        Collection  arr = new HashSet<>();


        arr.add("a");


        arr.add("b");


        arr.add("C");//可以添加重复的对象
         for(Object a:arr) {
         if(a.equals("b")) {
             arr.remove(a);
         } 
         }
    }
      
}
复制代码

猜你喜欢

转载自www.cnblogs.com/yizhizhangBlog/p/9258514.html