深入剖析java迭代器以及C#迭代器!
目录:
- 知道迭代器接口Iterable
- 为什么java的for增强可以自动迭代
- 那些类可以被迭代
- 通过什么方法迭代
1.知道迭代器接口Iterable
解析: 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。
2.为什么java的for增强可以自动迭代
解析:for增强只能迭代实现了Iterable接口的类,并且自动调用该类中的iterator()方法;
3.那些类可以被迭代?
解析:只要该类实现了Iterator接口或者继承的父类实现了Iterator接口,就可以被迭代.
4.通过什么方法迭代
解析:因为Iterable接口中只有一个方法:iterator(),这个方法的返回值就是Iterator<T>;而Iterator接口中又定义了三个方法,分别是:hasNext,next,remove
这三个方法分别代表为
- 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#借鉴来的,所以他俩的代码都差不多一个概念.