Научитесь очищать 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