В Java ArrayList.listIterator() возвращает ListIterator, который выполняет итерацию по элементам текущего списка. ListIterator — это двунаправленный итератор, который по своей природе является отказоустойчивым. По умолчанию элементы, возвращаемые итератором списка, находятся в правильной последовательности.
1. Метод ArrayList.listIterator()
Метод listIterator() перегружен и существует в двух вариантах:
- ListIterator listIterator() – Возвращает итератор списка по элементам в этом списке.
- ListIterator listIterator(int index) – Возвращает итератор списка по элементам в этом списке(в правильной последовательности), начиная с указанной позиции в списке. Указанный индекс указывает первый элемент, который будет возвращен начальным вызовом next. Начальный вызов previous вернет элемент с указанным индексом минус один.
Параметр метода – индекс первого элемента, который будет возвращен из итератора списка.
Метод возвращает – итератор списка по элементам.
Метод выдает исключение IndexOutOfBoundsException, если индекс выходит за пределы диапазона(меньше 0 или больше размера списка).
2. Пример
Следующая программа Java выполняет итерацию ArrayList с использованием итератора списка, полученного с помощью метода listIterator(), и выполняет итерацию списка в прямом и обратном направлениях.
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=========ABCD===========Backward=========DCBA
3. Добавление и удаление элементов во время итерации
ListIterator поддерживает добавление и удаление элементов в списке во время его итерации.
- listIterator.add(Element e) – элемент вставляется непосредственно перед элементом, который будет возвращен методом next(), или после элемента, который будет возвращен методом previous().
- listIterator.remove() – удаляет из списка последний элемент, который был возвращен методом next() или previous().
ArrayList<String> alphabets = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));ListIterator<String> listItr = alphabets.listIterator();listItr.next(); //AlistItr.next(); //BlistItr.add("E");System.out.println(alphabets); //["A", "B", "E", "C", "D"]listItr.next(); //ClistItr.remove();System.out.println(alphabets); //["A", "B", "E", "D"]
4. ListIterator быстро терпит неудачу
ListIterator быстро терпит неудачу. Это означает, что если мы изменим arraylist после создания итератора списка, то он выдаст ConcurrentModificationException при вызове метода next() или previous().
ArrayList<String> alphabets = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));ListIterator<String> listItr = alphabets.listIterator();listItr.next(); //AlistItr.next(); //Balphabets.add("E");System.out.println(alphabets); //["A", "B", "C", "D", "E"]System.out.println(listItr.next()); //Error
Вывод программы.
AB[A, B, C, D, E]Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at com.howtodoinjava.example.ArrayListExample.main(ArrayListExample.java:22)5. Различия между Iterator и ListIterator
Итератор ListIterator Может использоваться для итерации всех классов коллекций. Может использоваться для итерации только классов, реализованных в List. Поддерживает только итерацию в прямом направлении. Поддерживает итерации как в прямом, так и в обратном направлении. Поддерживает только операции READ и DELETE. Поддерживает все операции CRUD. Получено с помощью метода iterator(). Получено с помощью метода listIterator(). Вот и все, что касается ArrayList listIterator() в Java.