Очистка ArrayList с помощью clear() и removeAll()

Научитесь очищать ArrayList или очищать ArrayList в Java. Очистка списка означает удаление всех элементов из списка. Это то же самое, что и сброс списка в начальное состояние, когда в нем не хранится ни одного элемента.

Чтобы очистить ArrayList в Java, мы можем использовать два метода.

Оба метода в конечном итоге очистят список. Но есть разница в том, как они выполняют операцию очистки.

1. Очистите ArrayList с помощью clear()

Следующая программа Java очищает массив arraylist с помощью API clear().

ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d", "e"));list.clear();Assertions.assertEquals(0, list.size());

2. Очистите ArrayList с помощью removeAll()

Программа Java для удаления всех элементов arraylist с помощью метода removeAll(). Метод removeAll() удаляет все элементы в текущем списке, которые присутствуют в указанной коллекции.

В этом примере мы передаем ссылку на сам список методу removeAll().

ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d", "e"));list.removeAll(list);Assertions.assertEquals(0, list.size());

3. Разница между clear() и removeAll()

Как я уже говорил, оба метода очищают список. Но разница в том, как они очищают список. Давайте посмотрим код обоих методов, чтобы понять, какие действия они выполняют.

Метод clear() прост. Он перебирает список и присваивает null каждому индексу в списке.

public void clear(){// clear to let GC do its workfor(int i = 0; i < size; i++)elementData[i] = null;size = 0;}

В методе removeAll() сначала проверяется, присутствует ли элемент или нет, используя метод contains(). Если элемент присутствует, то он удаляется из списка. Это происходит для всех элементов в цикле.

public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, false);}private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for(; r < size; r++)if(c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if(r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}if(w != size) {// clear to let GC do its workfor(int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}

4. Заключение

Проанализировав исходный код обоих методов, можно с уверенностью сказать, что метод clear() обеспечивает гораздо лучшую производительность из-за меньшего количества выполняемых им операторов.

Метод removeAll() не обладает производительностью из-за дополнительных вызовов метода contains(). Но, тем не менее, метод removeAll() полезен в таких случаях, как слияние двух arraylist без дубликатов элементов.

Подробнее: Документация по ArrayList Java

Исходный код на Github

Прокрутить вверх