Что делает метод clear() у ArrayList в Java?

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

Ответ

Метод clear() удаляет все элементы из ArrayList, но сохраняет его capacity.

Основное поведение:

ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");

System.out.println(list.size());      // 3
System.out.println(list.isEmpty());   // false

list.clear();

System.out.println(list.size());      // 0
System.out.println(list.isEmpty());   // true
System.out.println(list.get(0));      // IndexOutOfBoundsException

Внутренняя реализация:

// Упрощенная реализация из OpenJDK
public void clear() {
    modCount++;

    // Обнуляем все ссылки для помощи GC
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

Ключевые характеристики:

Аспект Описание
Время выполнения O(n) - нужно обнулить n ссылок
Capacity Остается неизменной
Память Элементы становятся кандидатами на GC
Повторное использование Список можно использовать без пересоздания

Пример с capacity:

ArrayList<Integer> list = new ArrayList<>(100); // capacity = 100
for (int i = 0; i < 50; i++) {
    list.add(i);
}

System.out.println(list.size()); // 50
// Внутренний массив elementData.length = 100

list.clear();
System.out.println(list.size()); // 0
// elementData.length всё ещё = 100

Сравнение с альтернативами:

// 1. clear() - сохраняет capacity
list.clear();

// 2. Новый экземпляр - новая capacity
list = new ArrayList<>();

// 3. removeAll() - медленнее, проверяет коллекцию
list.removeAll(list);

// 4. removeIf - гибкое удаление
list.removeIf(e -> true); // удаляет все элементы

Рекомендации:

  • Используйте clear() когда нужно повторно использовать список с той же capacity
  • Используйте new ArrayList<>() когда capacity не важна или нужна меньшая
  • После clear() список в допустимом состоянии для добавления новых элементов