В чем разница между ArrayList.clear () и ArrayList.removeAll ()? - PullRequest
260 голосов
/ 12 августа 2011

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

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

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

Ответы [ 9 ]

365 голосов
/ 12 августа 2011

Исходный код для 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).

45 голосов
/ 12 августа 2011

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

Так что да, ArrayList.clear намного быстрее.

14 голосов
/ 12 августа 2011

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

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

7 голосов
/ 12 августа 2011

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

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

7 голосов
/ 12 августа 2011

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

4 голосов
/ 12 августа 2011

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

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

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

2 голосов
/ 12 августа 2011

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

Remove all не обязательно означает удаление всех элементов в списке, должны быть удалены только те элементы, которые указаны в качестве параметров. Следовательно, требуется больше усилий, чтобы сохранить те, которые не следует удалять.

ПОЯСНЕНИЯ

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

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

1 голос
/ 12 августа 2011

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

0 голосов
/ 09 июля 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...