容器-Iterator迭代器(二十)

容器-Iterator迭代器(二十)

  1. 迭代器:就是为了实现List接口和Set接口的遍历有一个统一的规则。Collection接口继承了Iterator接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的实现类对该方法做了具体实现。iterator方法会返回一个Iterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。

  2. Iterator对象的工作原理
    在这里插入图片描述

  3. 迭代器的3个方法

    • boolean hasNext();//判断游标当前位置有没有元素,如果有返回true,否则返回false
    • Object next(); // 获取当前游标所在位置的元素,并将游标移动到下一个位置
    • void remove();//删除游标元素,在执行完next后该操作只能实行一次
  4. 使用Iterator迭代List接口类型容器

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class IteratorListTest {
          
          
        public static void main(String[] args) {
          
          
            //实例化容器
            List<String> list=new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
    
            //获取元素
            //获取迭代器对象
            Iterator<String> iterator=list.iterator();//帮助我们如何从容器获取元素,取多少次他是不负责的
           /* //获取迭代器单个元素
            boolean flag=iterator.hasNext();//判断当前有没有元素
            if (flag){
                String value=iterator.next();//获取元素,并向下一个位置移动指针
                System.out.println(value);
            }*/
           //方式一:在迭代器中,通过while循环获取元素
            while (iterator.hasNext()){
          
          
                String value=iterator.next();
                System.out.println(value);
            }
            System.out.println("------------------------------");
            //方式二:在迭代器中,通过for循环获取元素
            for (Iterator<String> it=list.iterator();it.hasNext();){
          
          
                String value=it.next();
                System.out.println(value);
            }
    
    
    
        }
    }
    
  5. 使用Iterator迭代Set接口类型容器

    public class IteratorSetTest {
          
          
        public static void main(String[] args) {
          
          
            //实例化Set类型的容器
            Set<String> set= new HashSet<>();
            set.add("a");
            set.add("b");
            set.add("c");
    
            //方式一:通过while循环
            //获取迭代器对象
            Iterator<String> iterator=set.iterator();
            while (iterator.hasNext()){
          
          
                String value=iterator.next();
                System.out.println(value);
            }
            System.out.println("----------------------------------");
            //方式二:通过for循环
            for (Iterator<String> it=set.iterator();it.hasNext();){
          
          
                String value=it.next();
                System.out.println(value);
            }
    
        }
    }
    
  6. 在迭代器中删除元素

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class IteratorRemoveTest {
          
          
        public static void main(String[] args) {
          
          
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
    
            //方式五:用迭代器删元素(建议不要使用在这个方法),建议使用修正法,要删除元素,在循环外面删除
            Iterator<String> iterator=list.iterator();
            while (iterator.hasNext()){
          
          
                //不要在一次循环中多次调用next方法
                String value=iterator.next();
                if ("c".equals(value)){
          
          
                    iterator.remove();
                }
            }
            System.out.println("-----------------------------------");
            for (Iterator<String> it=list.iterator();it.hasNext();){
          
          //因为迭代器是一次性的,所以这里要重新建立一个迭代器
                System.out.println(it.next());
                //list.add("dddd");for迭代也是不可以向容器当中添加元素的,因为还是会并发修改异常
            }
    
    
    
    
            /*//方式四:用增强for循环删除元素
            for (String str:list){
                if ("c".equals(str)){
                    list.remove(str);
                }
                //list.add("dd");//ConcurrentModificationException,并发修改异常,不能在for-each循环添加元素,
                // 因为for-each也是在迭代器实现的
            }
            for (String str:list){
                System.out.println(str);
            }*/
    
    
    
          /*  //方式三:修正法
            int flag = -1;//修正法
            for (int i = 0; i < list.size(); i++) {
                if ("c".equals(list.get(i))) {
                    flag = i;
                }
            }
            if (flag > -1) {//说明有元素
                list.remove(flag);
            }
            for (String str : list) {
                System.out.println(str);
            }*/
    
          /*//方式二:用if条件删除(是可以的)
            for (int i = 0; i < list.size(); i++) {
               /if ("c".equals(list.get(i))){//给个if判断条件,这样删除还是可以的,不会影响到删除d
                    list.remove(2);
                }
                System.out.println(list.get(i));
            }*/
    
          /*//方式一:这样直接在for循环里直接remov是错误的
            for (int i = 0; i < list.size(); i++) {
               /// list.remove(2);//这样删除元素是错误的,因为咋这个数组中,你索引为2的元素删除完之后,
                // 索引为3的元素会自动向前移一位,变成了索引为2的元素,而for循环这导致他又删除了索引为2的元素。
                //所以只会剩下a、b
                //list.add("dddd");这样在for循环里面添加元素,只会导致死循环,因为你每次添加一次,就会使list.size()加一次,导致无限加了元素的个数,导致死循环
    
            }*/
    
        }
    }
    
    

猜你喜欢

转载自blog.csdn.net/Xun_independent/article/details/114793001
今日推荐