2016-04-01 8 views
1

Also, irgendwie in Fortsetzung dieses Beitrags: What is the difference between ArrayList.clear() and ArrayList.removeAll()? ... Gibt es bestimmte Situationen, in denen es tatsächlich besser ist removeAll() zu verwenden, anstatt clear()?Soll ich ArrayList.clear() verwenden oder eine neue Liste erstellen?


, auch auf diese Frage hinzuzufügen, wenn ich weiß, dass ich den gesamten Inhalt eines ArrayList bin löschen, wäre es in Ordnung, es zu einem neuen ArrayList zu setzen?

ArrayList myList = new ArrayList<String>(); 

myList.add("a"); 
myList.add("b"); 

// instead of using: myList.clear(); 
myList = new ArrayList<String>() 

Wenn die oben in Ordnung ist, wieder zu tun, verwenden Sie warum clear() zu einem neuen ArrayList vs Einstellung? Erstellen eines neuen, leeren ArrayList ist schneller als O (n).

+3

Ja, wenn Sie 'remove' gut brauchen,' all' die Elemente in _another_ 'list' aus dem aktuellen. 'clear' und' removeAll' sind völlig unterschiedliche Methoden und haben völlig unterschiedliche Anwendungsfälle. Fast ** nie ** willst du eine 'neue ArrayList' zuweisen, anstatt' clear' zu nennen - zum Beispiel, wie weißt du überhaupt, dass die'Liste' eine 'ArrayList' ist? –

Antwort

9

Warum clear() verwenden, anstatt ein neues ArrayList zu schaffen? Mehrere Gründe:

  • Sie nicht ein Referenzfeld neu zuweisen könnte erlaubt werden, die an einem Arraylist Punkte, so können Sie eine bestehende Liste löschen, aber keine neue an ihre Stelle setzen. Zum Beispiel:

    class MyData { 
        // Can clear() but not reassign 
        final List<Object> list = new ArrayList<>(); 
    } 
    
  • Die Variablen könnten als List deklariert werden. Der tatsächliche Typ könnte LinkedList sein und Sie möchten es beibehalten, anstatt die Implementierung durch eine ArrayList zu ersetzen.

  • Es ist nicht unbedingt wahr, dass clear() ist O (n) Zeit. Eine Umsetzungsstrategie ist, um alle vorhandenen Elemente in der Trägeranordnung ungültig zu machen in O ( n) Zeit. Eine andere gleichermaßen gültige Implementierung besteht darin, dieses interne Array wegzuwerfen und es durch ein neues zu ersetzen, vorzugsweise ein kurzes Array für den (1) -Varianten.

1

Es gibt keine ArrayList.removeAll(). Aber es gibt eine ArrayList.removeAll(Collection). Die Methode clear() sollte schneller als removeAll(Collection) sein, da removeAll (Collection) einige Vergleiche durchführt, um zu entscheiden, ob ein Objekt aus der Liste entfernt werden soll. Die clear() Methode entfernt einfach alles ohne nachzudenken.

+0

Diese Methoden sind vollständig _different_, und die Frage, die Sie beantworten, wird bereits in der [verknüpften Frage] beantwortet (https://stackoverflow.com/questions/7032070/what-is-the-difference-with-arraylist-clear-and) -arraylist-removeall). Sie vergleichen [Äpfel und Orangen] (https://en.wikipedia.org/wiki/Apples_and_oranges) und beantworten die Frage nicht. –

0

wenn Sie eine bestimmte Sammlung aus der Liste entfernen möchten, aber Sie wollen nicht alles entfernen, werden Sie verwenden, um alle mit der Sammlung entfernen, die Sie entfernen möchten.

Verwandte Themen