Quelle est la différence entre ArrayList.clear () et ArrayList.removeAll()?

En Supposant que arraylist est défini comme ArrayList<String> arraylist, est arraylist.removeAll(arraylist) équivalent à arraylist.clear()?

Si c'est le cas, puis-je supposer que la méthode clear() est plus efficace pour vider la liste des tableaux?

Y a-t-il des mises en garde à utiliser arraylist.removeAll(arraylist) au lieu de arraylist.clear()?

236
demandé sur CaptJak 2011-08-12 00:01:17

9 réponses

Le code source de clear():

public void clear() {
    modCount++;

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

    size = 0;
}

Le code source de removeAll()(tel Que défini dans 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() est beaucoup plus rapide car il n'a pas à traiter tous les appels de méthode.

Et comme le souligne Atrey, c.contains(..) augmente la complexité temporelle de removeAll à O (N^2) par opposition à clear'S O(N).

334
répondu Jeffrey 2016-02-26 15:16:19

La complexité du temps de ArrayList.clear() est O(n) et de removeAll est O(n^2).

Donc, oui, ArrayList.clear est beaucoup plus rapide.

43
répondu Geoff 2017-04-04 09:51:25

Le clear() méthode supprime tous les éléments d'un seul ArrayList. C'est une opération rapide, car elle définit simplement certains éléments de tableau sur null.

La méthode removeAll(Collection), héritée de AbstractCollection, supprime tous les éléments de la collection d'arguments de la collection sur laquelle vous appelez la méthode. C'est une opération relativement lente, car elle doit chercher dans l'une des collections impliquées.

12
répondu Ernest Friedman-Hill 2011-08-11 20:10:02

, Sauf s'il existe une optimisation spécifique qui vérifie si l'argument passé à removeAll() est la collection elle-même (et j' hautement doute qu'une telle optimisation est de là), il sera significativement plus lent qu'un simple .clear().

En dehors de cela (et au moins tout aussi important): arraylist.removeAll(arraylist) est juste obtus, le code confus. C'est une façon très rétrograde de dire "effacer cette collection". Quel avantage aurait-il sur le très compréhensible arraylist.clear()?

7
répondu Joachim Sauer 2011-08-11 20:06:31

Ils servent deux buts différents. clear() efface simplement une instance de la classe, removeAll() supprime tous les objets donnés et retourne à l'état de l'opération.

5
répondu lucapette 2017-04-20 08:20:53

clear() passera par le tableau sous-jacent et définira chaque entrée à null;

removeAll(collection) passera par la vérification ArrayList pour la collection et {[2] } si elle existe.

J'imagine que clear() est beaucoup plus rapide que removeAll car il ne compare pas, etc.

4
répondu Nicholas 2011-08-11 20:12:23

Clear est plus rapide car il ne Boucle pas sur les éléments à supprimer. Cette méthode peut supposer que tous les éléments peuvent être supprimés.

Remove all ne signifie pas nécessairement supprimer tous les éléments de la liste, seuls ceux fournis en tant que paramètres doivent être supprimés. Il faut donc redoubler d & apos; efforts pour conserver celles qui ne devraient pas être supprimées.

CLARIFICATION

Par 'loop', je veux dire qu'il n'a pas à vérifier si l'élément doit être conservé ou non. Il peut définir la référence à null sans chercher dans les listes d'éléments à supprimer fournies.

Clear EST plus rapide que deleteall.

2
répondu Jérôme Verstrynge 2011-08-11 20:09:09

Clear() sera beaucoup plus efficace. Il va simplement supprimer chaque élément. Utiliser removeAll (arraylist) prendra beaucoup plus de travail car il vérifiera chaque élément dans arraylist pour voir s'il existe dans arraylist avant de le supprimer.

1
répondu CDelaney 2011-08-11 20:07:17

Array => une fois l'espace est alloué pour une variable de Tableau au moment de l'exécution, l'espace alloué ne peut être prolongée ou retirée.

ArrayList = > ce n'est pas le cas dans arraylist. ArrayList peut croître et rétrécir au moment de l'exécution. L'espace alloué peut être réduit ou maximisé au moment de l'exécution.

-6
répondu Arun Kumar 2014-07-09 12:41:23