Cuando tenemos que hacer un programa en el que debemos usar una lista, nos surge la duda de que clase usar, ArrayList o LinkedList.
Vamos a ver las diferencias entre ambas.
Un ArrayList es una matriz dinámica que nos permite almacenar datos e incrementa su tamaño de acuerdo a la necesidad de forma automática, en ella podemos agregar, borrar y buscar elementos accediendo a ellos por su número de índice.
Un LinkedList es una lista enlazada de elementos, similar al ArrayList, pero a diferencia de este que guarda los datos en una matriz, LinkedList lo hace de manera lineal almacenando la información en posiciones de memoria que no son contiguas y en elementos nodo, donde cada elemento contiene datos y un puntero direccionado a uno de sus elementos vecinos o a ambos (hacia atrás y hacia adelante), de esta forma se elimina la necesidad de ordenar los elementos en la memoria.
En una lista enlazada (LinkedList) no se puede acceder de forma directa a un elemento, ya que para acceder a un elemento en la ubicación n, debemos recorrer toda la lista de forma lineal, hasta llegar a dicha posición, mientras que en una matriz (ArrayList) el acceso a cada elemento es por su índice, lo que evita tener que recorrer en forma lineal, solo se solicita la posición deseada (índice) y se accede a ella.
ArrayList y LinkedList implementan la interface List del paquete java.util y por lo tanto tendrán los métodos propios de esta interface y que son comunes a todas las implementaciones.
Se pone de manifiesto aquí la utilidad que tiene el uso de interfaces, ya que usando los mismos métodos, podemos tener varias implementaciones diferentes, de acuerdo a la necesidad que tenga nuestra aplicación.
LinkedList | ArrayList |
Se pueden agregar elementos indefinidamente | Una vez llena la matriz, debe incrementarse su tamaño |
Eliminar elementos es más eficaz, no deja espacios vacíos | Al eliminar un elemento, se borra el contenido, pero el espacio de memoria queda ocupado y no puede usarse nuevamente |
Solo acceso secuencial de los elementos, por lo tanto es más lento | Acceso aleatorio a los datos por medio de su índice, así el acceso es más rápido |
Utiliza más almacenamiento de memoria en la computadora, ya que no solo contiene el dato, sino también la dirección del próximo nodo | El espacio que ocupa en memoria es más reducido, porque contiene menos información |
Debe usarse en listas grandes, donde la totalidad de elementos y su contenido se desconoce. | Debe usarse para pequeñas listas, donde se conocen sus elementos |
Ambas clases tienen ventajas y desventajas dependiendo del uso que le daremos a la lista.
Si necesitamos acceder a elementos aleatorios o introducir nuevos elementos en posiciones específicas un ArrayList es lo más conveniente por su acceso por índices.
Si el uso más importante del array dinámico es la inserción en la primera o última posición de la lista y eliminación de uno o varios elementos, LinkedList es mucho más veloz y utiliza menos recursos del sistema.
Por el contrario, una particular desventaja de ArrayList, es que la eliminación de un elemento de la matriz borra el contenido, pero la posición queda vacía y no puede volver a utilizarse, esto no sucede con las listas enlazadas, la posición vacía vuelve a llenarse con un nuevo dato.
En cuanto a búsqueda es más veloz un ArrayList, porque lo hace a través del índice del elemento, mientras que LinkedList, debe hacerlo de forma lineal, recorriendo uno a uno los nodos hasta hallar el elemento deseado.
En caso de desconocer el tipo de operación que tendrá la lista, será más adecuado utilizar un ArrayList.
LinkedList tiene varias opciones de navegación entre elementos:
import java.util.LinkedList;
public class linkedList {
public static void main(String[] args) {
LinkedList<String> names = new LinkedList<String>();
names.add("Sandra");
names.add("Pablo");
names.add("Juan");
names.add("Maria");
System.out.println(names);
}
}