Arraylist
Muchas veces queremos resetear un ArrayList para reutilizarlo, por resetear nos referimos a vaciarlo o eliminar todos los elementos. Hay dos maneras de restablecer un ArrayList en Java, utilizando el método clear() o llamando a removeAll(). La elección de clear() vs removeAll() puede hacer una gran diferencia en el rendimiento de tu aplicación Java.
Si tu ArrayList es lo suficientemente pequeño como para contener sólo 10 o 100 elementos, entonces puedes utilizar cualquiera de estos dos métodos sin preocuparte demasiado, pero, si tienes una lista enorme de muchos objetos como un ArrayList que contiene 10M de entradas, entonces la elección de clear() vs removeAll() puede hacer una gran diferencia en el rendimiento de tu aplicación Java.
A veces es incluso mejor crear un nuevo ArrayList en lugar de restablecer el antiguo, especialmente si el restablecimiento lleva mucho tiempo, pero esto también tiene una advertencia, es necesario asegurarse de que el viejo ArrayList es elegible para la recolección de basura, de lo contrario, hay un gran riesgo de java.lang.OutOfMemoryError: Java Heap Space.
Volviendo al método clear() vs removeAll(), siempre deberías usar clear(), porque te da un rendimiento O(n), mientras que removeAll(Collection c) es peor, da un rendimiento O(n^2), por eso ves una gran diferencia en el tiempo que se tarda en limpiar una ArrayList grande con estos dos métodos.
Las cosas serán obvias, cuando ejecutes nuestro programa de ejemplo y veas el código de los métodos clear() y removeAll() de la API del JDK.
Por cierto, si tienes dudas, utiliza el método clear(), y si no, prefiere siempre clear sobre removeAll en Java.
Clear() vs RemoveAll(Collection c) en Java
Para comparar el rendimiento de ambos métodos, es muy importante ver su código. Puedes consultar el código fuente del método clear() en la clase java.util.ArrayList, para mayor faciliidad lo he incluido aquí.
/**
* Removes all of the elements from this list. The list will
* be empty after this call returns.
*/
public void clear() {
modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
Puedes ver que este método hace un bucle sobre ArrayList y asigna un null a cada elemento para hacerlos elegibles para la “garbage collection, por supuesto, si no hay ninguna referencia externa.
Del mismo modo, puedes consultar el código fuente de la clase java.util.AbstractCollection para ver cómo funciona el método removeAll(Collection c), aquí tienes el snippet:
public boolean removeAll(Collection c) {
boolean modified = false;
Iterator it = iterator();
while (it.hasNext()) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}
Esta implementación itera sobre la colección, comprobando cada elemento devuelto por el iterador, a su vez, para ver si está contenido en la colección especificada. Si está presente, entonces se elimina de esta colección utilizando el método remove de Iterator.
Debido al uso del método contains(), el rendimiento de removeAll() entra en el rango de O(n^2), lo cual es un absolutamente NO, especialmente si estás tratando de restablecer un ArrayList grande.
Si estás interesado más en la medición del rendimiento de Java y la puesta a punto, entonces también sugiero que eches un vistazo a Java Performance The Definitive Guide By Scott Oaks, uno de los mejores libros sobre el perfil de Java.
Conclusiones
Te invito a conocer a profundidad nuestro contenido y también la oportunidad de continuar desarrollándote con Metaphorce.mx
Nuestro equipo proveé de soluciones y conocimiento en tecnologías de la información, gobierno de TI y Desarrollo de soluciones a la medida para tu organización. De esta manera nuestros servicios de consultoría y transformación digital aceleran a tu organización a alcanzar sus metas. No dudes en contactarnos.
Te invitamos a continuar leyendo más de nuestros artículos. ¿Tienes alguna sugerencia o duda respecto a los servicios de consultoría y transformación digital para acelerar a tu organización y alcanzar tus metas? No dudes en contactarnos.
Fuente y agradecimiento a: Javarevisited | Javin Paul
Comparte este artículo y síguenos en nuestras distintas Redes Sociales
¿Iniciamos?
Conoce todas las soluciones tecnológicas para acelerar
la transformación digital de tu organización.