JDK源码阅读——ArrayList(2)
2016-04-11 16:39
525 查看
public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") 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]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer<? super E> consumer) { Objects.requireNonNull(consumer); final int size = ArrayList.this.size; int i = cursor; if (i >= size) { return; } final Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } while (i != size && modCount == expectedModCount) { consumer.accept((E) elementData[i++]); } // update once at end of iteration to reduce heap write traffic cursor = i; lastRet = i - 1; checkForComodification(); } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
iterator()方法新建并返回一个ArrayList的迭代器,该迭代器是个内部类,扩展了Iterator< E >接口。迭代器分别使用两个int型变量cursor和lastRet分别指向下一个返回的元素和最近返回的元素。
迭代器中用得最多的方法是hasNext()和next()。hasNext()将cursor与ArrayList的size进行比较,若相等说明无下一个元素,则返回false,否则返回true;next()首先比较cursor与size,若cursor>=size则抛出异常,否则返回cursor所指向的元素并将cursor赋给lastRet,然后cursor++。
remove方法则删除lastRet所指向的元素,即上一个返回的元素,并将lastRet赋给cursor,同时lastRet = -1。
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- Ubuntu 安装 JDK 问题
- C#.Net ArrayList的使用方法
- 浅析Ruby的源代码布局及其编程风格
- VBS ArrayList Class vbs中的数组类
- asp.net 抓取网页源码三种实现方法
- C#中Arraylist的sort函数用法实例分析
- C#中ArrayList的使用方法
- C#中Array与ArrayList用法及转换的方法
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- jQuery源码分析之jQuery中的循环技巧详解
- 本人自用的global.js库源码分享
- java中原码、反码与补码的问题分析
- ASP.NET使用HttpWebRequest读取远程网页源代码
- jdk与jre的区别 很形象,很清晰,通俗易懂
- jdk中String类设计成final的原由
- win7下安装 JDK 基本流程
- jdk环境变量配置
- win2003 jsp运行环境架设心得(jdk+tomcat)