Предполагая, что arraylist
определяется как ArrayList<String> arraylist
, arraylist.removeAll(arraylist)
эквивалентно arraylist.clear()
?
Если да, могу ли я предположить, что clear()
метод более эффективен для очистки списка массивов?
Есть ли какие-то предостережения в использовании arraylist.removeAll(arraylist)
вместо arraylist.clear()
?
arraylist.removeAll(arraylist)
? Я не вижу абсолютно никаких причин для этого.elementData[i] = null
иe.remove()
значительным?arrList.removeAll(arrList)
вместоarrList.clear()
.arrList1.removeAll(arrList2)
это другое дело.if (c == this && !isEmpty()) { clear(); return true; }
, Я должен представить это OpenJDK как патч! ;-)Ответы:
Исходный код для
clear()
:Исходный код
removeAll()
(как определено вAbstractCollection
):clear()
намного быстрее, так как он не должен иметь дело со всеми этими дополнительными вызовами методов.И, как указывает Атри,
c.contains(..)
увеличивает временную сложностьremoveAll
до O (n 2 ), а неclear
O (n).источник
c.contains(...)
возводит в квадрат временную сложность операции, сделает этот ответ завершенным.AbstractList.Itr.remove()
иArrayList.remove(int)
)size = 0; elementData = new Object[10];
все остальное было бы собрано мусором, поскольку резервный массив не имеет внешних ссылок.Сложность времени
ArrayList.clear()
естьO(n)
иremoveAll
естьO(n^2)
.Так что да,
ArrayList.clear
намного быстрее.источник
clear()
Метод удаляет все элементы одногоArrayList
. Это быстрая операция, так как она просто устанавливает элементы массива вnull
.removeAll(Collection)
Метод, который наследуется отAbstractCollection
удаляет все элементы , которые находятся в коллекции аргументов из коллекции вы вызовите метод. Это относительно медленная операция, поскольку она должна искать в одной из участвующих коллекций.источник
Если нет специальной оптимизации, которая проверяет, является ли передаваемый аргумент
removeAll()
самой коллекцией (и я очень сомневаюсь, что такая оптимизация есть), она будет значительно медленнее, чем простая.clear()
.Помимо этого (и, по крайней мере, не менее важно):
arraylist.removeAll(arraylist)
просто тупой, запутанный код. Это очень обратный способ сказать «очистить эту коллекцию». Какое преимущество это будет иметь над очень понятнымarraylist.clear()
?источник
Они служат разным целям.
clear()
очищает экземпляр класса,removeAll()
удаляет все заданные объекты и возвращает состояние операции.источник
clear()
будет проходить через основной массив и устанавливать каждую запись на ноль;removeAll(collection)
будет проходить проверку ArrayList для сбора иremove(Object)
его, если он существует.Я полагаю, что
clear()
это намного быстрее, чем удалить все, потому что это не сравнение и т. Д.источник
Очистить быстрее, потому что он не зацикливает элементы для удаления. Этот метод может предполагать, что ВСЕ элементы могут быть удалены.
Remove all
не обязательно означает удаление всех элементов в списке, ДОЛЖНЫ быть удалены только те, которые указаны в качестве параметров. Следовательно, требуется больше усилий, чтобы сохранить те, которые не следует удалять.ПОЯСНЕНИЯ
Под «циклом» я подразумеваю, что он не должен проверять, должен ли элемент сохраняться или нет. Он может установить ссылку
null
без поиска в предоставленных списках элементов для удаления.Clear
Быстрее чемdeleteall
.источник
ArrayList.clear()
тоже должно пройти.target.removeAll(param)
будет перебирать,param
а затем вызывать,target.contains(...)
который перебираетtarget
.clear () будет намного эффективнее. Это просто удалит каждый элемент. Использование removeAll (arraylist) потребует намного больше работы, потому что он проверит каждый элемент в arraylist, чтобы увидеть, существует ли он в arraylist, прежде чем удалять его.
источник
Array => как только пространство выделено для переменной Array во время выполнения, выделенное пространство не может быть расширено или удалено.
ArrayList => Это не так в arraylist. ArrayList может расти и уменьшаться во время выполнения. Выделенное пространство может быть минимизировано или максимизировано во время выполнения.
источник