1.集合之iterator()方法实现源码分析。

集合中接口继承结构,这里以ArrayList实现类为例说明

  • Iterable接口
    • Colection接口

      • List接口
        • ArryList实现类

      在这里插入图片描述

public interface Collection<E> extends Iterable<E>{
		Iterator<T> iterator();
}

public interface List<E> extends Collection<E>{
		Iterator<E> iterator();
}

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}

Iterable(java.lang.Iterable) 接口和Iterator(java.util.Iterator) 接口

  • Iterable 接口是所有集合接口的父接口, Collection extends Iterable, 该接口内部有一个重要的抽象方法 iterator()
  • Iterator iterator() 返回Iteartor接口,该接口含有两个重要的抽象方法,分别是next() 和 hasNext(),也就是使用迭代器遍历的两个方法。
public interface Iterator<E> {

    boolean hasNext();
    
    E next();
}
  • 对于接口中的抽象方法,实现类必须要对抽象就行重写,如下所示,在ArrayList类中实现的iterator方法如下所示,实现的具体内容源码如下。
 public Iterator<E> iterator() {
        return new Itr();
    }
 private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        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 Iterator<E> iterator() {
        return new Itr();//通过多态的方式返回接口的实现类
    }
   //ArrayList内部实现类
 private class Itr implements Iterator<E> {
        int cursor;       // 模拟指针指向下一个需要返回的元素
        int lastRet = -1; // 用来保存
        int expectedModCount = modCount;
        Itr() {}
        
        public boolean hasNext() {
            return cursor != size;
        }
        // 该方法作用 1.使corsor指针后移,2.输出移动指针移动前的值
        public E next() {
            int i = cursor;
            // elementData是arrayList的底层数组,这里创建一个数组引用指向该数组
            Object[] elementData = ArrayList.this.elementData;
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

}

下面用一个具体的例子来说明:

		List<String> list = new ArrayList<>();
        //向集合中添加元素
        Collections.addAll(list,"a1","b2","c3");
        //遍历  这里写法不懂得可以参考 https://editor.csdn.net/md/?articleId=116519094
        for (Iterator it = list.iterator();it.hasNext();){
            System.out.println(it.next());
        }
		//或者是采用常规写法
		Iterator it = list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
  • 具体流程图如下:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值