zoukankan      html  css  js  c++  java
  • 深入剖析java迭代器以及C#迭代器!

    目录:

    1. 知道迭代器接口Iterable
    2. 为什么java的for增强可以自动迭代
    3. 那些类可以被迭代
    4. 通过什么方法迭代

    1.知道迭代器接口Iterable

    解析: 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。

    2.为什么javafor增强可以自动迭代

    解析:for增强只能迭代实现了Iterable接口的类,并且自动调用该类中的iterator()方法;

    3.那些类可以被迭代?

    解析:只要该类实现了Iterator接口或者继承的父类实现了Iterator接口,就可以被迭代.

    4.通过什么方法迭代

    解析:因为Iterable接口中只有一个方法:iterator(),这个方法的返回值就是Iterator<T>;而Iterator接口中又定义了三个方法,分别是:hasNext,next,remove

    这三个方法分别代表为

    1. hasNext();方法
    public boolean hasNext() {
    
                return cursor != size();
    
    }

    对比帧数,当调用hasNext方法的时候,跟元素个数size()进行对比,如不等于size()的时候,return true;

         2. next();方法

    public E next() {
    
                checkForComodification();
    
          try {
    
        E next = get(cursor);
    
        lastRet = cursor++;
    
        return next;
    
          } catch (IndexOutOfBoundsException e) {
    
        checkForComodification();
    
        throw new NoSuchElementException();
    
          }
    
      }

    当hasNext()方法执行完毕后,系统自动调用next()方法,读取下一条数据;

    cursor//当前元素的索引.

    E next = get(cursor);//根据当前索引,获取值

    lastRet = cursor++;//索引+1;

    3. remove();方法

    public void remove() {
    
          if (lastRet == -1)
    
        throw new IllegalStateException();
    
                checkForComodification();
    
     
    
          try {
    
        AbstractList.this.remove(lastRet);
    
        if (lastRet < cursor)
    
            cursor--;
    
        lastRet = -1;
    
        expectedModCount = modCount;
    
          } catch (IndexOutOfBoundsException e) {
    
        throw new ConcurrentModificationException();
    
          }
    
      }

    当前方法的操作:当调用这个方法的时候,删除当前元素并且让cursor赋值为上一个,并且让lastRet改为-1,方便下次调用.

    checkForComodification();此方法用来判断创建迭代对象的视乎List的modCount与现在List的modCount是否一样,不一样的话就报出ConcurrentModificationException()异常

    java的迭代器就先剖析到这里,接下来我们看看C#的迭代器.

    IEnumerable类

    public interface IEnumerable
    
    {
    
        [DispId(-4), __DynamicallyInvokable]
    
        IEnumerator GetEnumerator();
    
    }

    IEnumerator类中,和java大致是一样的,因为它也有三个方法:分别是

    bool MoveNext();//就和java中的hasNext()方法大概一致
    object Current { [__DynamicallyInvokable] get; }//它和java中next()方法差不多,
    void Reset();//它就是java中的remove方法. 

    也可以说,java的迭代器,是从C#借鉴来的,所以他俩的代码都差不多一个概念.

  • 相关阅读:
    [总结] 二维ST表及其优化
    [51Nod 1515] 明辨是非
    [总结] fhq_Treap 学习笔记
    [ZJOI2008] 骑士
    [SDOI2010] 古代猪文
    [POJ 1006] 生理周期
    [POJ 2891] Strange Way to Express Integers
    [Luogu 1516] 青蛙的约会
    python第十三天
    python第十二天-----RabbitMQ
  • 原文地址:https://www.cnblogs.com/xjdoconline/p/4911846.html
Copyright © 2011-2022 走看看