zoukankan      html  css  js  c++  java
  • 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 了

    下面是工作原理图:

     

  • 相关阅读:
    40+精彩的HTML5实例和教程
    10+不错的设计资源和灵感的网站
    js利用点击事件做一个简单的计算器
    如何在canvas中画出一个太极图
    利用canvas画一个实时时钟
    利用随机数与定时器做一个简单的伪随机抓阄游戏
    IE8模对话框无法返回至主页面的解决方法
    C# String.Format字符串中包含"{" "}"时需注意的问题
    [Struts2应用开发] 统一的登录验证
    Visual Studio 2008 Express中文版 ‘加载此属性页是出错’ 解决方法
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8976387.html
Copyright © 2011-2022 走看看