Java核心技术-集合-Iterator迭代器

Iterator迭代器

一、 Iterator迭代器概述

Iterator是Collection集合的迭代器即提供对Collection集合的遍历操作,迭代器允许操作者在遍历的过程中同时删除元素。

  1. 所有的Collection接口的容器类都有一个Iterator方法用以返回一个实现了Iterator接口的对象
  2. Iterator对象称为迭代器,用以方便的对容器内的元素进行遍历
  3. Iterator定义了以下方法:
方法名作用
hasNext判断是否有下一个元素
next返回当前游标右边的元素,并将游标移动到下一个位置
remove删除游标左边的数据,在执行完next以后,该操作执行一次

二、Iterator迭代器使用方法

1.使用迭代器的遍历以及删除的基本方法

  public static void main(String[] args) {
    List<Father> list = new ArrayList<>();
    list.add(new Father("cch", 18));
    list.add(new Father("sz", 26));
    list.add(new Father("zc", 24));
    //通过实现类调用iterator实现方法
    Iterator<Father> i = list.iterator();
    //使用hasNext方法判断下一个角标是否已到达集合长度的未尾,如果是说明下个角标没有数据了  返回false
    while (i.hasNext()) {
      //将角标右移到下一位并返回游标右边的元素
      Father father = i.next();
      //删除对象,必须和next()方法协同使用不然报错
      i.remove();
      System.err.println(father);
    }
  }

Iterator迭代器源码解析

以List中的ArrayList为例解析利用Iterator完成遍历、删除的后台逻辑

	
  public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
        /*
        *当调用iterator实现方法后会将private的内部类Itr返回出去,
		*接下来的所有hasNext,next,remove方法都是使用Itr类实现后的方法
		*/
	    public Iterator<E> iterator() {
         return new Itr();
        }
        private class Itr implements Iterator<E> {
        //游标
        int cursor;
        //记录上一个被操作的角标
        int lastRet = -1;  
   
        int expectedModCount = modCount;
        Itr() {}
		
		//判断如果角标等于了集合的长度,说明没有数据了
        public boolean hasNext() {
            return cursor != size;
        }
		/**
		*1、获取当前角标的数据
		*2、将游标移动到下一个位置
		*/
        public E next() {
        	//处理并发修改
            checkForComodification();
            //获得这次需要返回的角标
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            //将游标移动到下一个位置,为下次获取数据做准备   
            cursor = i + 1;
            //返回元素
            return (E) elementData[lastRet = i];
        }

        public void remove() {
        	 (lastRet < 0)
                throw new IllegalStateException();
                //处理并发修改
            checkForComodification();
            try {
            	//这里就是为什么调用remove方法前必须先进行next,不然未对lastRet进行赋值可能会出现异常
                ArrayList.this.remove(lastRet);
                //删除后未避免对下次next产生异常,将cursor记录器赋值成被删的元素角标
                cursor = lastRet;
                //避免多次remove方法产生异常
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
    }
}

ListIterator接口

ListIterator是一个相较于Iterator更强大的迭代器,继承于Iterator接口,扩展了很多新的方法,同时也只能对各种List进行访问,操作。

特点

  1. 可以向前或向后遍历
  2. 在遍历的时候可对元素进行修改
  3. ListIterator定义了以下方法:
方法名作用
hasNext判断此列表迭代器在右侧是否还有数据
next返回列表中右侧的元素并将游标向前推进
hasPrevious判断此列表迭代器在左侧是否还有数据
previous返回列表中左侧的元素并将游标向后推进
nextIndex返回当前游标所在的位置
previousIndex返回当前游标的前一个位置
remove删除调用next()或previous()返回的最后一个元素
set将指定元素替换列表中调用next()或previous()返回的最后一个元素
add将数据插入到集合中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值