ArrayList 迭代器模式
程序员文章站
2022-05-04 13:23:49
...
在面试中,迭代器被问到了很多次,今天来总结一下。
从一个例子说起。
上面的例子很简单,但说明了迭代器最基本的结构:
1. 得到迭代器;
2. 判断是否有元素;
3. 获取元素。
现在到源码里去看它们是怎样实现的。
其实它里面有一个内部类的,再看这个类的成员有哪些。
下面是hasNext()方法的实现。
简单吧,就是判断当前的指针是否到最后了,我们猜测当前指针的变化应该是在next()方法中实现的。
其中的elementData是存储数据的地方,这个在开始就定义了。
这个数组的初始化在什么时候完成的呢?在你new的时候,默认大小是10.
总体来讲,迭代器还是比较简单的吧。
从一个例子说起。
public static void main(String args[]){ List list=new ArrayList(); list.add(2); list.add(5); list.add(7); Iterator Itr=list.iterator(); while(Itr.hasNext()){ System.out.println(Itr.next()); } }
上面的例子很简单,但说明了迭代器最基本的结构:
1. 得到迭代器;
2. 判断是否有元素;
3. 获取元素。
现在到源码里去看它们是怎样实现的。
public Iterator<E> iterator() { return new Itr(); }
其实它里面有一个内部类的,再看这个类的成员有哪些。
// 初始值为0,这个与C语言不一样,C是不确定的值 int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount;
下面是hasNext()方法的实现。
public boolean hasNext() { return cursor != size; }
简单吧,就是判断当前的指针是否到最后了,我们猜测当前指针的变化应该是在next()方法中实现的。
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]; }
其中的elementData是存储数据的地方,这个在开始就定义了。
private transient Object[] elementData;
这个数组的初始化在什么时候完成的呢?在你new的时候,默认大小是10.
public ArrayList() { this(10); }
总体来讲,迭代器还是比较简单的吧。
上一篇: 访问者模式
下一篇: 日志配置ogback slf4j