Jaka jest różnica między ArrayList.clear () I ArrayList.removeAll()?

Zakładając, że arraylist jest zdefiniowane jako ArrayList<String> arraylist, jest arraylist.removeAll(arraylist) odpowiednik arraylist.clear()?

Jeśli tak, czy mogę założyć, że metoda clear() jest bardziej efektywna do opróżniania listy tablicy?

Czy są jakieś zastrzeżenia w używaniu arraylist.removeAll(arraylist) zamiast arraylist.clear()?

Author: CaptJak, 2011-08-12

9 answers

Kod źródłowy dla clear():

public void clear() {
    modCount++;

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

    size = 0;
}

Kod źródłowy dla removeAll() (zgodnie z definicją w 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() jest znacznie szybszy, ponieważ nie musi radzić sobie z tymi wszystkimi dodatkowymi wywołaniami metody.

I jak wskazuje Atrey, c.contains(..) zwiększa złożoność czasową removeAll do O(n^2) w przeciwieństwie do clear's O(n).

 334
Author: Jeffrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-26 15:16:19

Złożoność czasowa ArrayList.clear() wynosi O(n), A removeAll wynosi O(n^2).

Więc tak, ArrayList.clear jest znacznie szybszy.

 43
Author: Geoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 09:51:25

Metoda clear() usuwa wszystkie elementy pojedynczego ArrayList. Jest to szybka operacja, ponieważ ustawia niektóre elementy tablicy na null.

Metoda removeAll(Collection), która jest dziedziczona z AbstractCollection, usuwa wszystkie elementy znajdujące się w kolekcji argumentów z kolekcji, na której wywołujesz metodę. Jest to stosunkowo powolne działanie, ponieważ musi przeszukiwać jedną z zaangażowanych kolekcji.

 12
Author: Ernest Friedman-Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 20:10:02

O ile nie istnieje specyficzna optymalizacja, która sprawdza, czy argument przekazany do removeAll() jest zbiorem samym w sobie (i wysoce wątpi w to, że taka optymalizacja istnieje), to będzie znacznie wolniejszy niż zwykły .clear().

Poza tym (i przynajmniej równie ważne): arraylist.removeAll(arraylist) jest po prostu tępym, mylącym kodem. Jest to bardzo zacofany sposób powiedzenia "Wyczyść tę kolekcję". Jaką przewagę miałoby nad bardzo zrozumiałe arraylist.clear()?

 7
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 20:06:31

Służą one dwóm różnym celom. clear() po prostu czyści instancję klasy, removeAll() usuwa wszystkie podane obiekty i zwraca stan operacji.

 5
Author: lucapette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 08:20:53

clear() przejdzie przez podstawową tablicę i ustaw każdy wpis na null;

removeAll(collection) przejdzie przez ArrayList sprawdzanie kolekcji i remove(Object) to, jeśli istnieje.

Wyobrażam sobie, że clear() jest dużo szybszy niż removeAll, bo nie porównuje itp.

 4
Author: Nicholas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 20:12:23

Clear jest szybszy, ponieważ nie zapętla elementów do usunięcia. Ta metoda może zakładać, że wszystkie elementy mogą zostać usunięte.

Remove all nie musi to oznaczać usunięcia wszystkich elementów z listy, należy usunąć tylko te podane jako parametry. W związku z tym konieczne jest podjęcie większych wysiłków w celu zachowania tych, które nie powinny zostać usunięte.

Wyjaśnienie

Przez 'loop', mam na myśli, że nie musi sprawdzać, czy element powinien być zachowany, czy nie. Może ustawić odniesienie do null bez przeszukiwania podanych list elementów do usunięcia.

Clear jest szybszy niż deleteall.

 2
Author: Jérôme Verstrynge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 20:09:09

Clear() będzie znacznie wydajniejsze. Po prostu usunie każdy element. Używanie removeAll (arraylist) zajmie dużo więcej pracy, ponieważ sprawdzi każdy element w arraylist, aby sprawdzić, czy istnieje w arraylist przed usunięciem go.

 1
Author: CDelaney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 20:07:17

Array = > gdy przestrzeń jest przydzielona dla zmiennej Array w czasie wykonywania, przydzielonej przestrzeni nie można rozszerzyć ani usunąć.

ArrayList = > tak nie jest w arraylist. ArrayList może rosnąć i kurczyć się w czasie uruchamiania. Przydzielone miejsce można zminimalizować lub zmaksymalizować w czasie pracy.

 -6
Author: Arun Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 12:41:23