В чем разница между ArrayList.clear() и ArrayList.removeAll()?

Предполагая, что arraylist определяется как ArrayList<String> arraylist, arraylist.removeAll(arraylist) эквивалентно arraylist.clear()?

Если да, могу ли я предположить, что метод clear() более эффективен для опорожнения списка массивов?

Есть ли какие-либо оговорки в использовании arraylist.removeAll(arraylist) вместо arraylist.clear()?

Ответ 1

Исходный код для clear():

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

Исходный код для removeAll() (как определено в AbstractCollection):

public boolean removeAll(Collection<?> c) {
    boolean modified = false;
    Iterator<?> e = iterator();
    while (e.hasNext()) {
        if (c.contains(e.next())) {
            e.remove();
            modified = true;
        }
    }
    return modified;
}

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

И, как указывает Атри, c.contains(..) увеличивает временную сложность removeAll до O (n ^ 2) в отличие от clear O (n).

Ответ 2

Сложность времени ArrayList.clear() равна O(n), а removeAll - O(n^2).

Итак, да, ArrayList.clear выполняется намного быстрее.

Ответ 3

Метод clear() удаляет все элементы одного ArrayList. Это быстрая операция, поскольку она просто устанавливает элементы массива на null.

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

Ответ 4

Они служат разным целям. clear() очищает экземпляр класса, removeAll() удаляет все заданные объекты и возвращает состояние операции.

Ответ 5

Если не существует конкретной оптимизации, которая проверяет, передан ли аргумент removeAll() самой коллекции (и я очень сомневаюсь, что такая оптимизация есть), она будет значительно медленнее, чем простой .clear().

Помимо этого (и, по крайней мере, не менее важного): arraylist.removeAll(arraylist) - просто тупой, запутанный код. Это очень обратный способ сказать "очистить эту коллекцию". Какое преимущество у него было бы над очень понятным arraylist.clear()?

Ответ 6

clear() будет проходить через лежащий в основе массив и установить каждую запись в значение null;

removeAll(collection) будет проходить проверку ArrayList для коллекции и remove(Object), если она существует.

Я бы предположил, что clear() быстрее, чем removeAll, потому что он не сравнивается и т.д.

Ответ 7

Сброс быстрее, потому что он не перекрывает элементы для удаления. Этот метод может предполагать, что ВСЕ элементы могут быть удалены.

Remove all необязательно означает удаление всех элементов в списке, только те, которые предоставляются как параметры, ДОЛЖНЫ быть удалены. Следовательно, требуется больше усилий для сохранения тех, которые не следует удалять.

РАЗЪЯСНЕНИЕ

По 'loop', я имею в виду, что не нужно проверять, должен ли элемент храниться или нет. Он может установить ссылку на null, не просматривая предоставленные списки удаляемых элементов.

Clear быстрее, чем deleteall.

Ответ 8

clear() будет намного более эффективным. Он просто удалит каждый элемент. Использование removeAll (arraylist) займет гораздо больше работы, потому что он проверяет каждый элемент в arraylist, чтобы увидеть, существует ли он в arraylist, прежде чем удалять его.

Ответ 9

Array = > как только пространство будет выделено для переменной Array во время выполнения, выделенное пространство не может быть расширено или удалено.

ArrayList = > Это не относится к arraylist. ArrayList может расти и сокращаться во время выполнения.            Выделенное пространство можно минимизировать или максимизировать во время выполнения.