Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Duda] array vs linked list

Más que duda es algo que quería mencionar como interesante. Teóricamente son correctas las consideraciones sobre el performance de hacer operaciones sobre una estructura u otra. Sin embargo, parece que en java nunca se consigue una mejora de rendimiento usando una linked list para por ejemplo agregar un elemento al principio de la colección. Siempre funciona mejor ArrayList. (en teoría un ArrayList tendría que copiarse y shiftear todos los elementos posteriores al insertado rindiendo mucho peor que un LinkedList que tiene que actualizar un puntero en dos elementos). Estaría bueno saber qué hace la JVM para que esto sea así.

2 respuestas
solución!

Hola Santiago, cómo estás?

Gracias por compartir tu duda en el foro.

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.

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.

Veamos las diferencias:

LinkedList:

  • Se pueden agregar elementos indefinidamente
  • Eliminar elementos es más eficaz, no deja espacios vacíos
  • Solo acceso secuencial de los elementos, por lo tanto es más lento
  • 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
  • Debe usarse en listas grandes, donde la totalidad de elementos y su contenido se desconoce.

ArrayList:

  • Una vez llena la matriz, debe incrementarse su tamaño
  • Al eliminar un elemento, se borra el contenido, pero el espacio de memoria queda ocupado y no puede usarse nuevamente
  • Acceso aleatorio a los datos por medio de su índice, así el acceso es más rápido
  • El espacio que ocupa en memoria es más reducido, porque contiene menos información
  • Debe usarse para pequeñas listas, donde se conocen sus elementos

Ahora cuando usar una y cuando usar otra, bueno veamos:

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.

Por último para indagar y profundizar sobre la JVM lo mejor es leer la documentación oficial, te adjunto el link. Link: https://docs.oracle.com/javase/specs/jvms/se8/html/

Espero haberte podido ayudar, saludos.

Si tienes alguna duda sobre el contenido de los cursos, estaremos aquí para ayudarte.

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

está bien... me tiraste un manual por la cabeza. Lo que yo estaba señalando, es que teóricamente ésta es la situación, verdad? (Obviemos que hay una razón por las que en éste cuadro tienen el prefijo My). Bueno, digo que en teoría "estoy de acuerdo", pero en la realidad por algún motivo de la JVM que desconozco, no tarda menos remover un elemento del principio en un LinkedList que en un ArrayList. Por otro lado en una parte del texto me decís que LinkedList accede de forma secuencial y sobre el final, que remover un elemento al principio y al final tardan menos que en un ArrayList. Habrás querido referirte a una Lista doble? Gracias. Lo marco como solucionado. Era una curiosidad, nomás.