46. 迭代器

Collection的迭代器:

      toArray      返回一个object类型的数组

      itaretor    返回在此 collection 的元素上进行迭代的迭代器

Iterator接口中的方法:

      hasNext()  当前指针是否有指向元素,有返回true,没有false
      next()    返回指针指向的元素后指针向下移动一个单位。
      remove()   移除迭代器最后一次返回的元素(注意:此方法不能直接执行,只有迭代器返回元素后才能使用,否则会报错)

需求:用迭代器循环集合

代码如下:

public static void main(String[] args) {
        Collection list = new  ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list);
        Iterator it = list.iterator();//返回一个迭代器
        while(it.hasNext()) {
            System.out.print(it.next()+",");
        }
    }

疑问1:iterator方法返回的不是一个接口吗,怎么可以调用方法呢?

我们来看看源代码

iterator方法的源代码如下()

原来它返回的是一个Itr类的对象,接下来我们看Itr是什么

public Iterator<E> iterator() {
        return new Itr();
    }

在Itr类的源代码中发现:

private class Itr implements Iterator<E>

原来是实现了Iterator接口的实现类,那么这个就是多态。

多态:父类引用变量指向了子类的对象

疑问2:hasNext()方法和next()方法的工作原理是什么呢?

下面是Itr实现类的两个方法的源代码:

public boolean hasNext() {
    return cursor != size;
}
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];
 }

这个是Itr实现类的成员变量

 int cursor;       // index of next element to return
 int lastRet = -1; // index of last element returned; -1 if no such
 int expectedModCount = modCount;

其他的代码先不看,我们可以发现首先先定义了一个cursor变量,当执行hasnext方法时先判断cursor是否不等于集合中元素的长度,不是,返回false,是返回ture。

next方法中首先我们可以看到int i = cursor 输出当前指针指向的元素后,cursor = i+1 了

下面是工作原理图:

 

原文地址:https://www.cnblogs.com/zjdbk/p/8976387.html