Java LinkedList – LinkedList En Java

Java LinkedList es una implementación de las interfaces List y Deque. Es una de las clases de implementación de List que se utiliza con frecuencia. Extiende AbstractSequentialList e implementa las interfaces List y Deque. Es una colección ordenada y admite elementos duplicados. Almacena elementos en orden de inserción. Admite la adición de elementos nulos. Soporta operaciones basadas en índices. Si deseas aprender más sobre los conceptos básicos de List, por favor revisa esta publicación: Java List.

Tabla de contenido breve del post

En este post vamos a discutir los siguientes conceptos.

  • Java LinkedList
  • Diagrama de Clase de Java LinkedList
  • Métodos de Lista de Java LinkedList
  • Métodos de Deque de Java LinkedList
  • Ejemplo Básico de Java LinkedList
  • Genéricos de Java LinkedList
  • De Array de Java a LinkedList
  • De LinkedList de Java a Array
  • Uso en tiempo real de Java LinkedList
  • Representación Interna de Java LinkedList
  • ¿Cómo funciona la inserción en Java LinkedList?
  • ¿Cómo funciona la eliminación en Java LinkedList?
  • Operaciones de Deque de Java LinkedList
  • Java SE 8: De Java LinkedList a Stream
  • Java SE 9 LinkedList

Java LinkedList

En esta sección, discutiremos algunos de los puntos importantes sobre Java LinkedList:

  • La clase Java LinkedList es un miembro del Framework de Colecciones de Java.
  • Es una implementación de las interfaces List y Deque.
  • Internamente, se implementa utilizando la Estructura de Datos de Lista Enlazada Doblemente.
  • Soporta elementos duplicados.
  • Almacena o mantiene sus elementos en orden de inserción.
  • Podemos añadir cualquier número de elementos nulos.
  • No está sincronizado, lo que significa que no es seguro para subprocesos.
  • Podemos crear una LinkedList sincronizada usando el método Collections.synchronizedList().
  • En aplicaciones Java, podemos usarla como una Lista, pila o cola.
  • No implementa la interfaz RandomAccess. Por lo tanto, solo podemos acceder a los elementos en orden secuencial. No admite el acceso a los elementos de forma aleatoria.
  • Cuando intentamos acceder a un elemento de un LinkedList, la búsqueda de ese elemento comienza desde el principio o el final del LinkedList según donde esté disponible ese elemento.
  • Podemos usar ListIterator para iterar los elementos de LinkedList.
  • A partir de Java SE 8, podemos convertir un LinkedList en un Stream y viceversa.
  • Java SE 9 va a añadir un par de métodos de fábrica para crear un LinkedList Inmutable.

Diagrama de Clase de la Clase LinkedList de Java

Como sabemos, LinkedList de Java es una de las implementaciones de la interfaz List. También implementa Deque. Como se muestra en el diagrama de clase a continuación, NO extiende directamente de la clase AbstractList. Extiende la clase AbstractSequentialList.

Métodos de Lista de Java LinkedList

En esta sección discutiremos algunos de los métodos útiles y frecuentemente utilizados de LinkedList de Java. Los siguientes métodos son heredados de la interfaz List o Collection:

  1. int size(): para obtener el número de elementos en la lista.
  2. boolean isEmpty(): para verificar si la lista está vacía o no.
  3. boolean contains(Object o): Devuelve true si esta lista contiene el elemento especificado.
  4. Iterator iterator(): Devuelve un iterador sobre los elementos de esta lista en secuencia adecuada.
  5. Object[] toArray(): Devuelve un arreglo que contiene todos los elementos de esta lista en secuencia adecuada.
  6. boolean add(E e): Añade el elemento especificado al final de esta lista.
  7. boolean remove(Object o): Elimina la primera ocurrencia del elemento especificado de esta lista.
  8. boolean retainAll(Collection c): Retiene solo los elementos en esta lista que están contenidos en la colección especificada.
  9. void clear(): Elimina todos los elementos de la lista.
  10. E get(int index): Returns the element at the specified position in the list.
  11. E set(int index, E element): Replaces the element at the specified position in the list with the specified element.
  12. ListIterator listIterator(): Devuelve un iterador de lista sobre los elementos en la lista.
  13. List subList(int fromIndex, int toIndex): Devuelve una vista de la porción de esta lista entre el índice fromIndex, inclusive, y toIndex, exclusivo. La lista devuelta está respaldada por esta lista, por lo que los cambios no estructurales en la lista devuelta se reflejan en esta lista y viceversa.

Métodos de LinkedList y Deque en Java

Los siguientes métodos son específicos de la clase LinkedList, heredados de la interfaz Deque:

  1. void addFirst(E e): Inserta el elemento especificado al principio de esta lista.
  2. void addLast(E e): Inserta el elemento especificado al final de esta lista.
  3. E getFirst(): Retrieves, but does not remove, the first element of this list. This method differs from peekFirst only in that it throws an exception if this list is empty.
  4. E getLast(): Retrieves, but does not remove, the last element of this list. This method differs from peekLast only in that it throws an exception if this list is empty.
  5. E remvoeFirst(): Removes and returns the first element from this list.
  6. E removeLast(): Removes and returns the last element from this list.
  7. boolean offerFirst(E e): Inserta el elemento especificado al principio de esta lista.
  8. boolean offerLast(E e): Inserta el elemento especificado al final de esta lista.
  9. E pollFirst(): Retrieves and removes the first element of this list, or returns null if this list is empty.
  10. E pollLast(): Retrieves and removes the last element of this list, or returns null if this list is empty.
  11. E peekFirst(): Retrieves, but does not remove, the first element of this list, or returns null if this list is empty.
  12. E peekLast(): Retrieves, but does not remove, the last element of this list, or returns null if this list is empty.

Ejemplo Básico de LinkedList en Java

En esta sección, discutiremos sobre un ejemplo básico de Java LinkedList. Exploraremos algunas operaciones más útiles en las secciones siguientes. Ejemplo:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListDemo 
{
  public static void main(String[] args) 
  {
	List names = new LinkedList();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Resultado:-

LinkedList content: [Rams, Posa, Chinni, 2011]
LinkedList size: 4

Aquí hemos creado un objeto LinkedList y añadido 4 elementos. Como discutimos, el método LinkedList.size() se utiliza para obtener el número de elementos en la lista. NOTA:- Sin utilizar Genéricos, Java LinkedList admite elementos heterogéneos. Sin embargo, no se recomienda usar Colecciones sin Genéricos. Exploraremos las ventajas y el uso de Java Generics en la próxima sección con un ejemplo simple.

Java LinkedList con Genéricos

En esta sección, discutiremos cómo usar Genéricos con Java LinkedList. Como sabemos, los Genéricos de Java son útiles para escribir programación con Seguridad de Tipos y realizar verificaciones de tipo más fuertes en tiempo de compilación. También son útiles para eliminar la sobrecarga de conversión. Ejemplo:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListGenericsDemo
{
  public static void main(String[] args) 
  {
	List names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        // No podemos añadir algo que no sea una cadena
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Resultado:-

LinkedList content: [Rams, Posa, Chinni]
LinkedList size: 3

Aquí hemos creado un objeto LinkedList con Genéricos y añadido 3 elementos. Cuando intentamos agregar un número a LinkedList, arroja un error en tiempo de compilación.

Array de Java a LinkedList

En esta sección, exploraremos cómo convertir un Array de Java en un objeto LinkedList. Podemos hacerlo de muchas maneras, sin embargo, aquí solo he dado un enfoque. Ejemplo:-


import java.util.LinkedList;
import java.util.List;

public class JavaArrayToLinkedListDemo 
{
	public static void main(String[] args) 
	{
		Integer[] numbers = {1,2,3,4,5};
		List<Integer> numbersList = new LinkedList<>();
		for(Integer s : numbers){
			numbersList.add(s);
		}
		System.out.println(numbersList);
	}
}

Salida:-

[1, 2, 3, 4, 5]

Java LinkedList a Array

En esta sección, exploraremos cómo convertir un LinkedList de Java en un Array. Podemos hacerlo de muchas maneras, sin embargo, aquí solo he dado un enfoque. Ejemplo:-

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class LinkedListToJavaArrayDemo 
{
	public static void main(String[] args) 
	{		
		List<Integer> numbersList = new LinkedList<>();
		numbersList.add(1);
		numbersList.add(2);
		numbersList.add(3);
		numbersList.add(4);
		numbersList.add(5);
		Integer[] numbers = new Integer[numbersList.size()];
		
		numbers = numbersList.toArray(numbers);
		System.out.println(Arrays.toString(numbers));

	}
}

Salida:-

[1, 2, 3, 4, 5]

Java LinkedList Casos de Uso en Tiempo Real

En esta sección, discutiremos cuáles son los mejores y los peores escenarios de caso para usar LinkedList en aplicaciones Java. Mejor escenario de caso de uso:-

  • Cuando nuestra operación frecuentemente utilizada es agregar o eliminar elementos en el medio de la lista, LinkedList es la mejor clase para usar.

¿Por qué? Porque no necesitamos hacer más desplazamientos para agregar o eliminar elementos en el medio de la lista. Consulte la sección “¿Cómo funciona la inserción en J Java LinkedList?” para entenderlo en detalle. Peor escenario de caso de uso:-

  • Cuando nuestra operación frecuentemente utilizada es recuperar elementos de una lista, entonces LinkedList es la peor elección.

¿Por qué? Porque LinkedList solo soporta acceso secuencial, NO soporta acceso aleatorio. Por favor, consulta la sección “¿Cómo funciona la eliminación en Java LinkedList?” para entenderlo en detalle. NOTA:- LinkedList implementa List, Deque, Cloneable y Serializable. Pero no implementa la interfaz RandomAccess.

Representación Interna de Java LinkedList

Como sabemos, internamente Java LinkedList está implementada usando una Lista Doblemente Enlazada. Entonces, Java LinkedList representa sus elementos como Nodos. Cada Nodo está dividido en 3 partes como se muestra a continuación. Aquí, cada Nodo se utiliza para un propósito específico.

  1. La parte del Nodo del lado izquierdo se utiliza para apuntar al Nodo (o Elemento) anterior en la LinkedList.
  2. La parte del Nodo del lado derecho se utiliza para apuntar al siguiente Nodo (o Elemento) en la LinkedList.
  3. La parte del Nodo central se utiliza para almacenar los datos reales.

NOTA:- En JVM, LinkedList NO almacena sus elementos en orden consecutivo. Almacena sus elementos en cualquier espacio disponible y están conectados entre sí utilizando las porciones de Nodo Izquierdo y Derecho como se muestra en el diagrama siguiente.

¿Cómo funciona la inserción en Java LinkedList?

Ya hemos visto cómo LinkedList almacena sus elementos como Nodos en la sección anterior. En esta sección, discutiremos cómo funciona la operación de inserción de Java LinkedList internamente.

  1. Supongamos que nuestra LinkedList inicial tiene los siguientes datos.
    3. Realice la siguiente operación de inserción en esta LinkedList
linkedList.add(2,54);

Aquí estamos tratando de realizar la operación de inserción para agregar un nuevo elemento con valor “54” en el índice 2.5. La LinkedList actualizada se ve así.

¿Cómo funciona la eliminación en Java LinkedList?

Hemos visto cómo LinkedList realiza la operación de inserción internamente en la sección anterior. En esta sección, discutiremos cómo funciona la operación de eliminación de LinkedList de Java internamente.

  1. Supongamos que nuestra LinkedList inicial tiene los siguientes datos.
    3. Realice la siguiente operación de inserción en esta LinkedList
linkedList.remove(3);

Aquí estamos tratando de realizar la operación de eliminación para eliminar un elemento que está disponible en el índice 3.5. La LinkedList actualizada se ve así.

Operaciones de Deque de LinkedList de Java

Aquí exploraremos cómo funciona un objeto LinkedList como Deque. Utilizamos estas operaciones para implementar Colas o Pilas. Discutiremos cómo funciona una Pila o Colas en profundidad en mis próximas publicaciones. Ejemplo:-

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Deque;

public class LinkedListDequeOperationsDemo 
{
  public static void main(String[] args) 
  {
	Deque names = new LinkedList();
	names.add(2);
	names.addFirst(1);
	names.addLast(3);
	names.addFirst(0);
	names.addLast(4);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
	names.removeFirst();
	names.removeLast();
	
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());	
  }
}

Salida:-

LinkedList content: [0, 1, 2, 3, 4]
LinkedList size: 5
LinkedList content: [1, 2, 3]
LinkedList size: 3

Java SE 8: De LinkedList de Java a flujo

Aquí exploraremos cómo convertir un objeto LinkedList al concepto de flujo de Java SE 8. Ejemplo:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListToStreamDemo 
{
  public static void main(String[] args) 
  {		
	List numbersList = new LinkedList<>();
	numbersList.add(1);
	numbersList.add(2);
	numbersList.add(3);
	numbersList.add(4);
	numbersList.add(5);
		
	//convertir Lista a flujo
	numbersList.stream().forEach(System.out::println);
  }
}

Salida:-

1
2
3
4
5

Java SE 9 LinkedList

En Java SE 9, Oracle Corp va a agregar algunos métodos de utilidad útiles para crear una Lista Inmutable. Si deseas aprenderlos en profundidad con algunos ejemplos útiles, por favor revisa mi publicación en: Métodos de Fábrica para Lista Inmutable en Java SE 9 Eso es todo en un resumen rápido sobre LinkedList en Java. Espero que estos ejemplos de Java LinkedList te ayuden a comenzar con la programación de LinkedList. Gracias por leer mis tutoriales. Por favor, déjame un comentario si te gustan mis tutoriales o tienes algún problema o sugerencia o errores de algún tipo.

Source:
https://www.digitalocean.com/community/tutorials/java-linkedlist-linkedlist-java