Ответ
Доступ к элементам в коллекциях, реализующих интерфейс java.util.List, осуществляется несколькими способами:
1. Прямой доступ по индексу
Используется метод get(int index). Это основной способ для списков с эффективным произвольным доступом (например, ArrayList).
List<String> list = Arrays.asList("A", "B", "C");
String element = list.get(1); // Возвращает "B"
Важно: Для ArrayList сложность O(1), для LinkedList — O(n).
2. Использование итератора (Iterator) Стандартный способ для безопасного последовательного обхода и удаления элементов.
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (someCondition) {
iterator.remove(); // Безопасное удаление во время итерации
}
}
3. Использование ListIterator
Расширяет Iterator, позволяя обход в обоих направлениях, модификацию и получение индекса.
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String next = listIterator.next();
// listIterator.previous(); // Перемещение назад
// listIterator.set("newValue"); // Замена текущего элемента
}
4. Улучшенный цикл for (for-each)
Удобный синтаксический сахар для итерации, который компилируется в использование Iterator.
for (String item : list) {
System.out.println(item);
}
5. Использование Stream API (Java 8+) Для функциональных операций: фильтрации, преобразования, агрегации.
list.stream()
.filter(s -> s.startsWith("A"))
.forEach(System.out::println);
Выбор способа зависит от задачи:
- Получение конкретного элемента →
get(index). - Последовательный обход или удаление →
Iteratorилиfor-each. - Двунаправленный обход или замена →
ListIterator. - Функциональная обработка →
Stream API.