9-迭代器

迭代器

        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        
        //迭代器遍历:
        Iterator it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

iterator(),Iterator,Iterable关系

  • ArrayList集合--->(implements)List接口--->(extends)Collection接口--->(extends)Iterable接口--->(抽象方法)iterator()
  • 抽象方法要在具体的实现类中得到实现(此实现类是ArrayList)
  • iterator()方法返回类型是Iterator接口
  • Iterator接口中有两个经典方法:hasNext(),next()-->抽象方法----那么抽象方法在哪里具体实现呢?--->返回值的实现类
  • 在Itr这个类中得到具体实现(而该类是ArrayList的内部类)

hasNext(),next()的具体实现

  • Itr是ArrayList的内部类
  • Itr中实现了接口Iterator接口中定义的经典方法hasNext(),next()

增强for循环

  • 增强for循环 底层也是通过迭代器实现的

ListIterator迭代器

  • 加入字符串
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        //在“cc”之后添加一个字符串“kk”
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            if("cc".equals(it.next())){
                list.add("kk");
            }
        }
//发现报错:
Exception in thread "main" java.util.ConcurrentModificationException
    //并发修改异常
  • 出错原因:迭代器和list同时对集合进行操作
  • 解决办法:事情让一个"人"做--->引入新的迭代器:ListIterator
  • 迭代和添加操作都是靠ListIterator来完成
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        //在“cc”之后添加一个字符串“kk”
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()){
            if("cc".equals(it.next())){
                it.add("kk");//通过迭代器进行添加(只让一个“人”操作)
            }
        }

        System.out.println(list);//查看输出
        System.out.println(it.hasNext());//是否还有下一元素--false
        System.out.println(it.hasPrevious());//看前面是否还有元素--true
        //逆向遍历
        while (it.hasPrevious()){
            System.out.println(it.previous());
        }
        System.out.println(it.hasNext());//true---逆向遍历完后指针指向第一个元素
        System.out.println(it.hasPrevious());//false---此时指针在第一个元素,前面没有元素了
        System.out.println(list);
        
//输出:
[aa, bb, cc, kk, dd, ee]
false
true
ee
dd
kk
cc
bb
aa
true
false
[aa, bb, cc, kk, dd, ee]
        
posted @ 2024-09-08 15:44  呆头尖瓜  阅读(21)  评论(0)    收藏  举报