Java-集合篇-迭代器

迭代器

是一种设计模式,提供了一种方法,来对集合,容器进行遍历
不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的

iterator迭代器方法介绍:

boolean hasNext() :判断集合是否还有元素
E next() :返回当前数据
void remove() :删除元素

注意:使用时hasNext、next需要轮循出现(hasNext、remove也是一样)
    要自定义迭代器类
    类要具有iterator方法 需要实现iterable接口
   需要实现implements Iterator接口

并发异常问题:ConcurrentModificationException
原因:集合本身修改会引起modCount版本号的修改,而迭代器本身的版本号副本并未改变,因此会抛出该异常

fail-fast(快速失败机制)和 fail-safe(安全失败机制)

Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。
快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
fail-fast机制,是一种错误检测机制。
它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生。
若在多线程环境下使用fail-fast机制的集合,建议使用“java.util.concurrent包下的类”去取代“java.util包下的类”。

迭代器的简单使用
 public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(12);
        arrayList.add(45);
        arrayList.add(33);
        arrayList.add(44);
        arrayList.add(89);

        //通过for遍历
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i)+" ");
        }
        System.out.println();

        //通过迭代器遍历
        Iterator<Integer> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
//            if (value == 33) {
//                arrayList.remove(Integer.valueOf(33));
//            }
//            iterator.remove();
//            iterator.remove();
            System.out.print(value+" ");
        }
        System.out.println();
        System.out.println("size:" + arrayList.size());

        //增强for循环(底层是通过迭代器实现的)
        for (Integer i :arrayList) {
            System.out.print(i+" ");
        }
        System.out.println();

        //正序和逆序遍历
        System.out.print("next: ");
        ListIterator<Integer> listIterator = arrayList.listIterator();
        while (listIterator.hasNext()) {
            listIterator.nextIndex();//找元素对应的索引位置
            System.out.print(listIterator.next() + " ");
        }
        System.out.println();
        System.out.print("previous: ");
        ListIterator<Integer> listIterator1 = arrayList.listIterator(arrayList.size());
        while (listIterator1.hasPrevious()) {
            listIterator1.previousIndex();
            System.out.print(listIterator1.previous() + " ");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值