ArrayList listIterator() - 快速失败(Fail fast)

ListIterator是快速失败的。
这意味着如果我们在创建列表迭代器之后修改数组列表,那么它会在 next()或者 previous()方法调用上抛出 ConcurrentModificationException

import java.util.ArrayList;
import java.util.Arrays;
import java.util.ListIterator;
public class ArrayListExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ArrayList<String> alphabets = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

        ListIterator<String> listItr = alphabets.listIterator();

        System.out.println(listItr.next());     //A
        System.out.println(listItr.next());     //B

        alphabets.add("E");       

        System.out.println(alphabets);          //["A", "B", "C", "D", "E"]

        System.out.println(listItr.next());     //Error
    }
}

程序输出。

A
B
[A, B, C, D, E]
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at com.onitroad.example.ArrayListExample.main(ArrayListExample.java:22)
Java ArrayList listIterator() 方法

ArrayList listIterator() 返回在列表中的元素上的列表迭代器。
它是一个双向迭代器,本质上是fail-fast。

默认情况下,列表迭代器返回的元素按正确的顺序排列。

ArrayList listIterator() 方法

listIterator()方法被重载并有两种变体:

  • ListIterator<E> listIterator() - 返回列表中元素的列表迭代器。
  • ListIterator<E> listIterator(int index) - 返回列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。指定的 index表示初始调用 next 将返回的第一个元素。对previous 的初始调用将返回具有指定index减1 的元素。

要从列表迭代器返回的第一个元素的方法参数索引。

方法返回元素上的列表迭代器。

如果索引超出范围(小于 0 或者大于列表大小),则方法抛出 IndexOutOfBoundsException

ArrayList listIterator() - 迭代

Java 程序使用通过listIterator()方法获得的列表迭代器来迭代一个数组列表。
我们将学习向前和向后迭代列表。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.ListIterator;
public class ArrayListExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ArrayList<String> alphabets = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

        ListIterator<String> listItr = alphabets.listIterator();

        System.out.println("===========Forward=========");

        while(listItr.hasNext()) {
            System.out.println(listItr.next());
        }

        System.out.println("===========Backward=========");

        while(listItr.hasPrevious()) {
            System.out.println(listItr.previous());
        }
    }
}

程序输出。

===========Forward=========
A
B
C
D
===========Backward=========
D
C
B
A
www. On IT Road .com

ArrayList listIterator() - 添加/删除

ListIterator 支持在我们迭代列表时添加和删除列表中的元素。

  • listIterator.add(Element e) - 元素被插入到将被next()返回的元素之前或者将被返回到previous()方法的元素之后。
  • listIterator.remove() - 从列表中移除由 next()或者 previous()方法返回的最后一个元素。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.ListIterator;
public class ArrayListExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ArrayList<String> alphabets = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

        ListIterator<String> listItr = alphabets.listIterator();

        System.out.println(listItr.next());		//A
        System.out.println(listItr.next());		//B

        listItr.add("E");       

        System.out.println(alphabets); //["A", "B", "E", "C", "D"]

        System.out.println(listItr.previous());	//E
        System.out.println(listItr.next());		//E

        System.out.println(listItr.next());		//C

        listItr.remove();       

        System.out.println(alphabets); //["A", "B", "E", "D"]

        System.out.println(listItr.next());		//D
    }
}

程序输出。

A
B
[A, B, E, C, D]
E
E
C
D
[A, B, E, D]
日期:2020-09-17 00:09:56 来源:oir作者:oir