Zakładając, że arraylist
jest zdefiniowane jako ArrayList<String> arraylist
, jest arraylist.removeAll(arraylist)
równoważne arraylist.clear()
?
Jeśli tak, to czy mogę założyć, że clear()
metoda jest bardziej wydajna w przypadku opróżniania listy tablic?
Czy istnieją jakieś zastrzeżenia dotyczące używania arraylist.removeAll(arraylist)
zamiast arraylist.clear()
?
arraylist.removeAll(arraylist)
? Nie widzę absolutnie żadnego powodu, aby to robić.elementData[i] = null
ie.remove()
znacząca?arrList.removeAll(arrList)
Zamiast tego nie ma rozsądnego powoduarrList.clear()
.arrList1.removeAll(arrList2)
to inna sprawa.if (c == this && !isEmpty()) { clear(); return true; }
. Będę musiał przesłać to do OpenJDK jako poprawkę! ;-)Odpowiedzi:
Kod źródłowy dla
clear()
:Kod źródłowy
removeAll()
(zgodnie z definicją wAbstractCollection
):clear()
jest znacznie szybszy, ponieważ nie musi obsługiwać wszystkich dodatkowych wywołań metod.I jak podkreśla Atrey,
c.contains(..)
zwiększa złożoność czasowąremoveAll
do O (n 2 ) w przeciwieństwie doclear
O (n).źródło
c.contains(...)
wyrówna złożoność czasową operacji, dopełniłaby tę odpowiedź.AbstractList.Itr.remove()
iArrayList.remove(int)
)size = 0; elementData = new Object[10];
cała reszta byłaby śmieciami, ponieważ tablica podkładu nie ma zewnętrznych odwołań.Złożoność czasowa
ArrayList.clear()
jestO(n)
iremoveAll
jestO(n^2)
.Tak,
ArrayList.clear
jest znacznie szybszy.źródło
clear()
Sposób usuwa wszystkie elementy pojedynczeArrayList
. Jest to szybka operacja, ponieważ po prostu ustawia elementy tablicynull
.removeAll(Collection)
Metoda, która jest dziedziczona odAbstractCollection
usuwa wszystkie elementy, które znajdują się w zbiorach argument z kolekcji wywołać metodę dalej. Jest to stosunkowo powolna operacja, ponieważ musi przeszukiwać jedną z zaangażowanych kolekcji.źródło
O ile nie istnieje konkretna optymalizacja, która sprawdza, czy przekazanym argumentem
removeAll()
jest sama kolekcja (i bardzo wątpię, że taka optymalizacja istnieje), będzie ona znacznie wolniejsza niż prosta.clear()
.Poza tym (i co najmniej równie ważne):
arraylist.removeAll(arraylist)
jest po prostu tępy, mylący kod. Jest to bardzo odwrotny sposób powiedzenia „wyczyść tę kolekcję”. Jaką przewagę miałby nad bardzo zrozumiałymarraylist.clear()
?źródło
Służą do różnych celów.
clear()
czyści instancję klasy,removeAll()
usuwa wszystkie podane obiekty i zwraca stan operacji.źródło
clear()
przejdzie przez podstawową tablicę i ustawi każdy wpis na zero;removeAll(collection)
przejdzie przez ArrayList sprawdzając kolekcję iremove(Object)
jeśli istnieje.Wyobrażam sobie, że
clear()
jest to o wiele szybsze niż removeAll, ponieważ nie ma porównania itp.źródło
Czyszczenie jest szybsze, ponieważ nie zapętla elementów do usunięcia. W tej metodzie można założyć, że WSZYSTKIE elementy można usunąć.
Remove all
niekoniecznie oznacza usunięcie wszystkich elementów z listy, tylko te podane jako parametry POWINNY zostać usunięte. Dlatego konieczne są większe wysiłki, aby zachować te, których nie należy usuwać.WYJAŚNIENIE
Przez „pętlę” rozumiem, że nie musi sprawdzać, czy element powinien zostać zachowany, czy nie. Może ustawić odniesienie do
null
bez przeszukiwania dostarczonych list elementów do usunięcia.Clear
JEST szybszy niżdeleteall
.źródło
ArrayList.clear()
musi się zapętlić.target.removeAll(param)
wykona iterację,param
a następnie zadzwoni,target.contains(...)
która iteracja się zakończytarget
.clear () będzie znacznie wydajniejszy. Po prostu usunie każdy element. Korzystanie z removeAll (arraylist) zajmie o wiele więcej pracy, ponieważ sprawdzi każdy element w arraylist, aby sprawdzić, czy istnieje on w arraylist przed usunięciem.
źródło
Array => po przydzieleniu miejsca dla zmiennej Array w czasie wykonywania przydzielonej przestrzeni nie można rozszerzyć ani usunąć.
ArrayList => Nie jest tak w przypadku tablicy arraylist. ArrayList może rosnąć i kurczyć się w czasie wykonywania. Przydzielone miejsce można zminimalizować lub zmaksymalizować w czasie wykonywania.
źródło