zoukankan      html  css  js  c++  java
  • java Iterator遍历集合

    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)

    举例,会发现异常

    复制代码
    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);
             } 
             }
        }
          
    }
    复制代码
  • 相关阅读:
    centos下vsftpd不能显示文件,不能创建文件及文件夹
    PHP过滤常用标签的正则表达式
    px、dp、sp、mm、in、pt这些单位有什么区别?
    Android Studio升级后报 method not found: 'runProguard'的错误
    Android应用签名
    Android技巧小结之新旧版本Notification
    java中 synchronized 的使用,确保异步执行某一段代码。
    android开发笔记(二)导入项目到eclipse和另一个项目
    android开发笔记(一)Android studio 输入法
    这个算asp.net的一个bug吗?
  • 原文地址:https://www.cnblogs.com/yizhizhangBlog/p/9258514.html
Copyright © 2011-2022 走看看