Java基础知识之集合的迭代操作

一.集合的迭代操作:
把集合做的元素一个一个的遍历取出来.

二.迭代器对象
Iterator: 迭代器对象,只能从上往下迭代.
boolean hasNext(); 判断当前指针后是否有下一个元素
Object next():获取指针的下一个元素,并且移动指针.
ListIterator: 是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代.
Enumeration:古老的迭代器对象,现在已经被Iterator取代了. 适用于古老的Vector类.

public class IteratorDemo {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        //方式一:使用for循环
        for (int index=0;index<list.size();index++){
            Object ele = list.get(index);
            System.out.println(ele);
        }
        //方式二:使用foreach循环
        for (Object ele : list) {
            System.out.println(ele);
        }
        //方式三:使用while操作iterator迭代器
        Iterator<Object> it = list.iterator();//得到迭代器对象
        while (it.hasNext()){
            Object ele = it.next();
            System.out.println(ele);
        }
        //方式四:使用for循环来操作迭代器
        for(Iterator<Object> it1 = list.iterator();it1.hasNext();){
            Object ele = it1.next();
            System.out.println(ele);
        }
        //方式五:使用古老的迭代器Enumeration(操作vector),现在基本不使用
        Vector<Object> v = new Vector<>();
        v.add("A");
        v.add("B");
        v.add("C");
        Enumeration<Object> e = v.elements();
        while (e.hasMoreElements()){
            Object ele = e.nextElement();
            System.out.println(ele);
        }
    }
}

迭代器的指针:
在这里插入图片描述
三.深入分析for-each和迭代器:
1):foreach可以操作数组: 底层依然采用for循环+ 索引来获取数组元素.
2):foreach可以操作Iterable的实例:底层其实采用的Iterator(迭代器).
直接使用foreach迭代数组和集合元素即可,简单.
反编译:
在这里插入图片描述
四.边迭代边删除集合中的元素的问题:
当需要边迭代集合元素,边删除指定的元素时:此时只能使用迭代器.
而且只能使用迭代器对象的remove方法.

public class IteratorDemo1 {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        /*for (Object ele : list) {
            if("C".equals(ele)){
                list.remove(ele);//ConcurrentModificationException并发修改异常
            }
            System.out.println(ele);
        }*/
        //使用迭代器的删除方法
        Iterator<Object> it = list.iterator();
        while (it.hasNext()){
            if("C".equals(it.next())){
                it.remove();
            }
        }
        System.out.println(list);//[A, B]
    }
}

原理和解决办法:
在迭代集合的时候,边迭代边删除是非常常用的操作:
如何解决并发修改异常呢?
不要使用集合对象的删除方法.
在Collection接口中存在删除指定元素的方法:boolean remove(Object ele);
该方法只能从集合中删除元素,不能把迭代器中指定的元素也删除.
王道在于:使用Iterator中的remove方法.
该方法会从两个线程中同时移除被删除的元素,.保证了两个线程的同步.
在这里插入图片描述

发布了99 篇原创文章 · 获赞 2 · 访问量 2607

猜你喜欢

转载自blog.csdn.net/weixin_41588751/article/details/105299286