В чем разница между 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 может расти и сокращаться во время выполнения. Выделенное пространство можно минимизировать или максимизировать во время выполнения.