jueves, 25 de noviembre de 2010

ArrayList versus LinkedList

Tenía pendiente asimilar un conocimiento básico y esencial para la programación sana siempre orientada al rendimiento. Usualmente cuando ocupo una lista en el código que trabajo siempre utilizo un "ArrayList" y la verdad tenía en la caja del olvido la implementación de "LinkedList". ¿Cuáles son las principales diferencias entre estas dos implementaciones?

Ventajas del ArrayList

1. El ArrayList utiliza internamente un arreglo para el almacenamiento. Esto lo hace particularmente más rápido para los accesos aleatorios tipo "obtener(#n)".

Desventajas del ArrayList

1. El ArrayList es más lento para agregar/borrar elementos en el inicio o en el medio de la colección debido a que todos los elementos (localizados antes o después) deben ser copiados adelante o atrás.

Grafiquémolo de esta manera. Digamos que tengamos esta lista con 6 elementos.


Y queremos insertar otro elemento antes del segundo.


Para poder agregar ese elemento, internamente la lista tiene que copiar todos los elementos del índice 1 a 5 una posición adelante.

2. Similar al problema anterior, el ArrayList tiene problemas de rendimiento cuando el arreglo interno se llena ya que tiene que crear uno arreglo más grande y copiar todos los elementos del arreglo viejo al nuevo.

Ventajas del LinkedList

1. La LinkedList (o lista enlazada) es lo opuesto a el ArrayList. Es más eficiente para agregar/borrar elementos en el medio o al comienzo de la colección. Si alguna vez les tocó programar a pie una estructura de datos de lista enlazada, recordarán que en la clase nodo se guarda un puntero o referencia al siguiente elemento.




En este caso lo que se hace para insertar un nodo en el medio es crea un nuevo nodo apuntando al elemento de adelante (->c) y se actualiza el puntero/referencia del nodo anterior para que apunte al nuevo nodo (->b).





2. Como no tiene restricciones de tamaño, la LinkedList no tiene los problemas de crecimiento del ArrayList.

Desventajas del LinkedList

1. Los accesos aleatorios son costosos en un LinkedList ya que en el peor de los casos tiene que recorrer toda la lista para llegar al elemento solicitado.

En resumen podemos decir que deberíamos utilizar el ArrayList solo si sabemos que vamos a tener muchos accesos aleatorios, en caso contrario usamos el LinkedList por defecto.

1 comentario:

  1. O puede combinar ambas estrategias dependiendo del caso de uso, es decir!

    Si usted tiene que leer un documento muy grande, lo mejor es insertarlo en un linkedlist, una vez que tiene todo el contenido en el linkedlist, le pasa la colleccion como argumento al arraylist y sigue usando el arraylist para el resto de las lecturas :)

    Por ultimo agregar que el Vector, es sincronizado, por lo que solo es ventajoso cuando se ocupa una lista sincronizada, el Stack de hecho es un wrapper de vector pero con funcionalidad especifica de una pila.

    Por ultimo, si conoce la cantidad de elemento agregar, es mejor usar el arraylist de una, pero con el constructor mediante el cual se le puede indicar el tamano inicial :)

    ResponderEliminar