Ответ
Метод 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()список в допустимом состоянии для добавления новых элементов