2011-08-11 18 views
212

Suponiendo que arraylist se define como ArrayList<String> arraylist, ¿es arraylist.removeAll(arraylist) equivalente a arraylist.clear()?¿Cuál es la diferencia entre ArrayList.clear() y ArrayList.removeAll()?

Si es así, ¿puedo suponer que el método clear() es más eficaz para vaciar la lista de matrices?

¿Hay alguna advertencia al usar arraylist.removeAll(arraylist) en lugar de arraylist.clear()?

+0

Un posible corolario de esta pregunta: ¿Cuándo se puede usar uno en lugar del otro? –

+3

@Corey: ¿cuándo podría uno querer usar 'arraylist.removeAll (arraylist)'? No veo absolutamente ninguna razón para hacer eso. –

+0

@Joachim Sauer Eso es exactamente lo que quería verificar. Gracias +2. Pero, ¿la diferencia entre 'elementData [i] = null' y' e.remove() 'es significativa? – ateiob

Respuesta

304

El código fuente para clear():

public void clear() { 
    modCount++; 

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

    size = 0; 
} 

El código fuente de removeAll() (como se define en 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() es mucho más rápido, ya que no tiene que lidiar con todo esas llamadas al método extra.

Y como señala Atrey, c.contains(..) aumenta la complejidad de tiempo de removeAll a O (n^2) en comparación con clear 's O (n).

+20

Una nota que 'c.contains (...)' cuadra el tiempo de complejidad de la operación haría que esta respuesta se complete. – Atreys

+0

@Jeffrey ¿Cuál es la diferencia entre 'elementData [i] = null' y' e.remove() '? – ateiob

+5

La fuente es fuerte en este caso. (Para todas las otras respuestas: use la fuente, Luke.) Observe cómo clear() podría implementarse como solo una línea, tamaño = 0; pero la recolección de basura no sabría recoger los elementos en las partes inalcanzables de la matriz. –

1

Borrar es más rápido porque no pasa por los elementos para eliminar. Este método puede suponer que TODOS los elementos se pueden eliminar.

Remove all no significa necesariamente eliminar todos los elementos en la lista, solo aquellos provistos como parámetros DEBERÍAN eliminarse. Por lo tanto, se requiere un mayor esfuerzo para mantener los que no deberían eliminarse.

CLARIFICACION

Por 'loop', quiero decir que no tiene que comprobar si el elemento debe mantenerse o no. Puede establecer la referencia en null sin buscar en las listas provistas de elementos para eliminar.

Clear ES más rápido que deleteall.

+1

Estoy bastante seguro de que 'ArrayList.clear()' también tiene que formarse un bucle. –

+0

@JVerstry ¿Quiere decir que clear() ** no elimina ** los elementos que elimina de ArrayList? – ateiob

+1

Wrong, clear hace un bucle sobre la matriz interna y establece todas las referencias a nulo para permitir que el recolector de basura haga su trabajo. – devconsole

4

Sirven para dos propósitos diferentes. clear() simplemente borra una instancia de la clase, removeAll() elimina todos los objetos dados y devuelve el estado de la operación.

+0

puede proporcionar un recurso para leer sobre el asunto anterior para referencia posterior –

+1

@KasunSiyambalapitiya ¿Qué hay de la [respuesta aceptada] (http://stackoverflow.com/a/7032144/3040381), que contiene el código fuente para los dos ? – Abdul

7

menos que haya una optimización específica que comprueba si el argumento pasado a removeAll() es la colección en sí (y altamente duda de que tal optimización es allí) será significativamente más lento que un simple .clear().

Aparte de eso (y al menos igualmente importante): arraylist.removeAll(arraylist) es solo un código obtuso y confuso. Es una forma muy retrógrada de decir "limpiar esta colección". ¿Qué ventaja tendría sobre el muy comprensiblearraylist.clear()?

1

claro() será mucho más eficiente. Simplemente eliminará todos y cada uno de los elementos. Usar removeAll (arraylist) requerirá mucho más trabajo, ya que verificará cada elemento en la lista de arrays para ver si existe en la lista de arrays antes de eliminarla.

35

La complejidad de tiempo de ArrayList.clear() es O(n) y de removeAll es O(n^2).

Así que sí, ArrayList.clear es mucho más rápido.

9

El método clear() elimina todos los elementos de un solo ArrayList. Es una operación rápida, ya que solo establece algunos elementos de matriz en null.

El método removeAll(Collection), que se hereda de AbstractCollection, elimina todos los elementos que están en la colección de argumentos de la colección que usted llama al método. Es una operación relativamente lenta, ya que tiene que buscar a través de una de las colecciones involucradas.

3

clear() irá a través de la matriz subyacente y establecer cada entrada a nulo;

removeAll(collection) revisará la colección ArrayList y remove(Object) si existe.

Me imagino que clear() es la manera más rápida que removeAll porque no está comparando, etc.

-5

Array => una vez que el espacio se reserva para una variable de matriz en el tiempo de ejecución, el espacio asignado no puede ser extendido o remoto.

ArrayList => Este no es el caso en la lista de arrays. ArrayList puede crecer y reducirse en el tiempo de ejecución. El espacio asignado puede minimizarse o maximizarse en el tiempo de ejecución.

+0

Esto no responde a la pregunta que es la diferencia entre ArrayList.clear() y ArrayList.removeAll(), no la diferencia entre una Matriz y una ArrayList. – Pierre

+0

Esta respuesta es innecesaria. De eso no se trata la pregunta. –

Cuestiones relacionadas