Почему в ArrayList есть метод get() и как он реализован?

«Почему в ArrayList есть метод get() и как он реализован?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод get() присутствует в ArrayList благодаря реализации интерфейса List<E>, который объявляет этот метод как обязательный для доступа к элементам по индексу.

Иерархия интерфейсов:

Iterable<E> (итерация)
    ↓
Collection<E> (базовые операции коллекции)
    ↓
List<E> (упорядоченная коллекция с доступом по индексу)
    ↓
ArrayList<E> (реализация на основе массива)

Реализация в ArrayList:

public E get(int index) {
    // Проверка выхода за границы (с Java 9)
    Objects.checkIndex(index, size);
    // Прямой доступ к элементу массива - O(1)
    return elementData[index];
}

Ключевые особенности:

  1. Сложность O(1) - доступ к элементу происходит за константное время, так как используется обычный массив
  2. Проверка границ - метод проверяет, что индекс находится в диапазоне [0, size-1]
  3. Type safety - благодаря дженерикам, возвращаемый тип соответствует типу коллекции

Пример использования:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String element = list.get(1); // "B" - получение за O(1)

// Сравнение с LinkedList (реализация get() через итерацию)
List<String> linkedList = new LinkedList<>(list);
String linkedElement = linkedList.get(1); // O(n) - требует обхода

Важно: Метод get() выбрасывает IndexOutOfBoundsException, если индекс выходит за пределы списка.