Какими способами осуществляется доступ к элементам коллекции через интерфейс List в Java?

«Какими способами осуществляется доступ к элементам коллекции через интерфейс List в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Доступ к элементам в коллекциях, реализующих интерфейс 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.