46. 迭代器

Posted 江小白谢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 了

 

下面是工作原理图:

 

 

 

以上是关于46. 迭代器的主要内容,如果未能解决你的问题,请参考以下文章

处理数组和 ES6 迭代器的混合

Simulink - 通过 MATLAB 命令行将 While 迭代器模块添加到子系统

快速排序迭代器要求

VSCode自定义代码片段——CSS选择器

片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变

VSCode自定义代码片段6——CSS选择器