Wat is het verschil tussen ArrayList.clear() en ArrayList.removeAll()?

Ervan uitgaande dat ArrayListis gedefinieerd als ArrayList<String> arraylist, is arraylist.removeAll(arraylist)gelijk aan arraylist.clear()?

Zo ja, mag ik ervan uitgaan dat de methode clear()efficiënter is voor het legen van de arraylijst?

Zijn er waarschuwingen bij het gebruik van arraylist.removeAll(arraylist)in plaats van arraylist.clear()?


Antwoord 1, autoriteit 100%

De broncode voor clear():

public void clear() {
    modCount++;
    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
}

De broncode voor removeAll()(Zoals gedefinieerd in 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()is veel sneller omdat het niet te maken heeft met al die extra methode-aanroepen.

En zoals Atrey aangeeft, verhoogt c.contains(..)de tijdscomplexiteit van removeAlltot O(n2) als in tegenstelling tot clear‘s O(n).


Antwoord 2, autoriteit 14%

De tijdscomplexiteit van arraylist.clear()is O(n)en van removeAllis O(n^2).

Dus ja, ArrayList.clearis veel sneller.


Antwoord 3, autoriteit 4%

De methode clear()verwijdert alle elementen van een enkele ArrayList. Het is een snelle operatie, omdat het de array-elementen gewoon op nullzet.

De methode removeAll(collection), die is overgenomen van AbstractCollection, verwijdert alle elementen in de argumentverzameling uit de verzameling waarop u de methode aanroept. Het is een relatief langzame operatie, omdat het een van de betrokken collecties moet doorzoeken.


Antwoord 4, autoriteit 2%

Tenzij er een specifieke optimalisatie is die controleert of het argument dat wordt doorgegeven aan removeAll()de verzameling zelf is (en ik ten zeerstebetwijfel of een dergelijke optimalisatie er is), is het zal aanzienlijklangzamer zijn dan een eenvoudige .clear().

Afgezien daarvan (en minstenseven belangrijk): arraylist.removeAll(arraylist)is gewoon stompe, verwarrende code. Het is een zeer achterlijke manier om te zeggen “wis deze verzameling”. Welk voordeel zou het hebben ten opzichte van de zeer begrijpelijkearraylist.clear()?


Antwoord 5, autoriteit 2%

Ze hebben verschillende doelen. clear()wist een instantie van de klasse, removeAll()verwijdert alle gegeven objecten en geeft de status van de bewerking terug.


Antwoord 6

clear()doorloopt de onderliggende array en stelt elk item in op null;

removeAll(collection)doorloopt de ArrayList-controle op verzameling en remove(Object)als deze bestaat.

Ik kan me voorstellen dat clear()veel sneller is dan removeall omdat het niet vergelijkt, enz.


Antwoord 7

CLEAR is sneller omdat het geen elementen loopt om te verwijderen. Deze methode kan aannemen dat alle elementen kunnen worden verwijderd.

Remove allverwijderen betekent niet noodzakelijkerwijs alle elementen in de lijst verwijderen, alleen die als parameters moeten worden verwijderd. Vandaar dat meer inspanning vereist is om die welke niet mogen worden verwijderd.

verduidelijking

Met ‘loop’, bedoel ik, het hoeft niet te controleren of het element moet worden bewaard of niet. Het kan de verwijzing naar nullinstellen zonder te zoeken via de meegeleverde lijsten van elementen om te verwijderen.

Clearis sneller dan deleteall.


Antwoord 8

Wissen () zal veel efficiënter zijn. Het zal eenvoudig elk item verwijderen. RemoveAll (ArrayList) kost veel meer werk omdat het elk item in ArrayList zal controleren om te zien of het bestaat in Arrayplay voordat u het verwijdert.


Antwoord 9

array = & gt; Zodra de ruimte is toegewezen voor een array-variabele op de runtime, kan de toegewezen ruimte niet worden verlengd of verwijderd.

Arrayclist = & GT; Dit is niet het geval in arrayclist. ArrayList kan groeien en krimpen op de looptijd.
De toegewezen ruimte kan worden geminimaliseerd of gemaximaliseerd op de runtime.

Other episodes