ArrayList的Iterator()方法理解

ArrayList有两种迭代器实现,都是按照索引查找,但比正常for循环多了并发操作的安全校验:
1. Itr()的实现,主要功能-后序遍历next()方法
public Iterator<E> iterator() {    return new Itr();}
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];}其中i >= elementData.length的校验非常疑惑,理论上elementData的扩容的等操作size应该小于elementData.length,不知道在什么并发场景下会触发??
public void remove() {    if (lastRet < 0)        throw new IllegalStateException();  // 调用remove()方法前,必须调用next()方法,给lastRet赋值    checkForComodification();

    try {        ArrayList.this.remove(lastRet);        cursor = lastRet;        lastRet = -1;  // 重置索引位        expectedModCount = modCount;  // 重置modify次数,因此在iterator方法中,不能使用remove(object)    } catch (IndexOutOfBoundsException ex) {        throw new ConcurrentModificationException();    }}
2. ListIterator继承自Itr类,主要功能扩展-前序遍历previous(), set()以及add()方法
public ListIterator<E> listIterator() {    return new ListItr(0);}
public ListIterator<E> listIterator(int index) {    if (index < 0 || index > size)  // 前序遍历第一个元素cursor - 1        throw new IndexOutOfBoundsException("Index: "+index);    return new ListItr(index);}
ListItr(int index) {    super();    cursor = index;  // 初始值范围 [0, size]}
public E previous() {    checkForComodification();    int i = cursor - 1;  // 对比和Itr迭代的区别    if (i < 0)        throw new NoSuchElementException();    Object[] elementData = ArrayList.this.elementData;    if (i >= elementData.length)        throw new ConcurrentModificationException();    cursor = i;    return (E) elementData[lastRet = i];}
 
 

原文地址:https://www.cnblogs.com/septemberFrost/p/12017191.html

时间: 2024-10-14 23:40:07

ArrayList的Iterator()方法理解的相关文章

HashMap的iterator()方法理解

HashMap开放3个迭代接口,共同继承了其内部的抽象父类HashIterator: final class KeyIterator extends HashIterator // 禁止被继承 implements Iterator<K> { public final K next() { return nextNode().key; }} final class ValueIterator extends HashIterator implements Iterator<V> {

深入理解java集合框架之---------Arraylist集合 -----添加方法

Arraylist集合 -----添加方法 1.add(E e) 向集合中添加元素 /** * 检查数组容量是否够用 * @param minCapacity */ public void ensureCapacity(int minCapacity){ modCount++; int oldCapacity = elementData.length; if(minCapacity > oldCapacity){ Object oldData[] = elementData; int newCa

JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象包装类 左为基本数据类型,又为引用数据类型 byte Byte int Integer long Long boolean Booleab float Float double Double char Character 我们拿Integer来举例子 //整

黑马程序员——java基础 ArrayList集合基本方法演示

java基础 ArrayList集合基本方法演示 import java.util.ArrayList; import java.util.Iterator; public class ArrayListDemos { public static void main(String[] args) { // 创建一个新的容器 ArrayList al = new ArrayList(); al.add("abc1"); al.add("abc2"); al.add(&

Java Collection集合中的iterator方法

Iterator接口的概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返回true. * 即判断集合中还有没有下ー个元素,有就返回true,没有就返回 false * E next() * 返回送代的下一个元素. * 即取出集合中的下一个元素 * iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象. * 获取实现类的方式比较特

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集

Hibernate面试题 --- list和iterator方法的区别

Hibernate面试题  ---  list和iterator方法的区别 1.首先看两个例子来比较一下 (1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出: 1 @Test 2 public void listQuery() { 3 4 Configuration configuration = new Configuration().configure(); 5 SessionFacto

多线程对比linkedList和arrayList的add方法

上上一篇对linkedList和arrayList的源码对比:http://blog.csdn.net/aaashen/article/details/44925181 上一篇对linkedList和arrayList的各种方法进行单线程的对比:http://blog.csdn.net/aaashen/article/details/45011365 本篇用多线程对比,之对比add方法,插10000000条数据. 其中arrayList add 数据花费11615,linkedlist add数

定制对ArrayList的sort方法的自定义排序

java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将ArrayList对象与实现Commparator接口的类的对象作为参数 示例: // 外部类的方式 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.uti