深入剖析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#借鉴来的,所以他俩的代码都差不多一个概念.

posted @ 2015-10-26 17:30  浮夸半生『  阅读(554)  评论(0编辑  收藏  举报