LinkedList di Java – LinkedList in Java

La LinkedList di Java è un’implementazione delle interfacce List e Deque. È una delle classi di implementazione di List più utilizzate. Estende AbstractSequentialList e implementa le interfacce List e Deque. È una collezione ordinata e supporta elementi duplicati. Memorizza gli elementi nell’ordine di inserimento. Supporta l’aggiunta di elementi null. Supporta operazioni basate sull’indice. Se vuoi conoscere di più sulle basi delle Liste, leggi questo post: Java List.

Contenuti brevi del post

In questo post discuteremo i seguenti concetti.

  • LinkedList di Java
  • Diagramma di classe LinkedList di Java
  • Metodi di Lista LinkedList di Java
  • Metodi di Deque LinkedList di Java
  • Esempio di base di LinkedList di Java
  • Generics di LinkedList di Java
  • Array di Java in LinkedList
  • LinkedList di Java in Array
  • Utilizzi reali di LinkedList di Java
  • Rappresentazione interna di LinkedList di Java
  • Come funziona l’inserimento in LinkedList di Java?
  • Come funziona la cancellazione in LinkedList di Java?
  • Operazioni di Deque in LinkedList di Java
  • Java SE 8: LinkedList di Java in Stream
  • Java SE 9 LinkedList

Java LinkedList

In questa sezione, discuteremo alcuni dei punti importanti riguardanti Java LinkedList:

  • La classe Java LinkedList è un membro del framework Java Collections.
  • È un’implementazione delle interfacce List e Deque.
  • Internamente, è implementato utilizzando la struttura dati Doubly Linked List.
  • Supporta elementi duplicati.
  • Memorizza o mantiene i suoi elementi nell’ordine di inserimento.
  • Possiamo aggiungere qualsiasi numero di elementi null.
  • Non è sincronizzato, il che significa che non è thread safe.
  • Possiamo creare un LinkedList sincronizzato utilizzando il metodo Collections.synchronizedList().
  • Nelle applicazioni Java, possiamo utilizzarlo come una lista, stack o coda.
  • Non implementa l’interfaccia RandomAccess. Quindi possiamo accedere agli elementi solo in ordine sequenziale. Non supporta l’accesso casuale agli elementi.
  • Quando proviamo ad accedere a un elemento da un LinkedList, la ricerca di quell’elemento inizia dall’inizio o dalla fine del LinkedList in base a dove quel elemento è disponibile.
  • Possiamo utilizzare ListIterator per iterare gli elementi del LinkedList.
  • Da Java SE 8 in poi, possiamo convertire un LinkedList in uno Stream e viceversa.
  • Java SE 9 sta per aggiungere un paio di metodi di fabbrica per creare un LinkedList immutabile.

Diagramma di classe della classe Java LinkedList

Come sappiamo, Java LinkedList è una delle classi di implementazione di List. Implementa anche Deque. Come mostrato nel diagramma delle classi qui sotto, non estende direttamente la classe AbstractList. Estende la classe AbstractSequentialList.

Metodi di LinkedList di Java

In questa sezione discuteremo alcuni dei metodi utili e frequentemente utilizzati di Java LinkedList. I seguenti metodi sono ereditati dall’interfaccia List o Collection:

  1. int size(): per ottenere il numero di elementi nella lista.
  2. boolean isEmpty(): per verificare se la lista è vuota o no.
  3. boolean contains(Object o): Restituisce true se questa lista contiene l’elemento specificato.
  4. Iterator iterator(): Restituisce un iteratore sugli elementi di questa lista nella sequenza corretta.
  5. Object[] toArray(): Restituisce un array contenente tutti gli elementi di questa lista nella sequenza corretta.
  6. boolean add(E e): Aggiunge l’elemento specificato alla fine di questa lista.
  7. boolean remove(Object o): Rimuove la prima occorrenza dell’elemento specificato da questa lista.
  8. boolean retainAll(Collection c): Mantiene solo gli elementi di questa lista che sono contenuti nella collezione specificata.
  9. void clear(): Rimuove tutti gli elementi dalla 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(): Restituisce un iteratore di lista sugli elementi della lista.
  13. List subList(int fromIndex, int toIndex): Restituisce una vista della porzione di questa lista tra il fromIndex specificato, inclusivo, e toIndex, esclusivo. La lista restituita è supportata da questa lista, quindi le modifiche non strutturali nella lista restituita si riflettono in questa lista e viceversa.

Metodi Java LinkedList Deque

I seguenti metodi sono specifici della classe LinkedList che sono ereditati dall’interfaccia Deque:

  1. void addFirst(E e): Inserisce l’elemento specificato all’inizio di questa lista.
  2. void addLast(E e): Inserisce l’elemento specificato alla fine di questa 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): Inserisce l’elemento specificato all’inizio di questa lista.
  8. boolean offerLast(E e): Inserisce l’elemento specificato alla fine di questa 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.

Esempio di base di Java LinkedList

In questa sezione, discuteremo dell’esempio di base della LinkedList di Java. Esploreremo alcune operazioni più utili nelle sezioni successive. Esempio:-

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());
  }
}

Output:-

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

Qui abbiamo creato un oggetto LinkedList e aggiunto 4 elementi. Come discusso in precedenza, il metodo LinkedList.size() viene utilizzato per ottenere il numero di elementi nella lista. NOTA:- Senza l’uso di Generics, Java LinkedList supporta elementi eterogenei. Tuttavia, non è consigliabile utilizzare le Collections senza Generics. Esploreremo i vantaggi e l’uso di Java Generics nella sezione successiva con un esempio semplice.

Java LinkedList Generics

In questa sezione, discuteremo come utilizzare i Generics con Java LinkedList. Come sappiamo, i Generics di Java sono utili per scrivere programmazione con Type Safety e effettuare controlli di tipo più rigorosi durante il tempo di compilazione. Sono anche utili per eliminare l’overhead di casting. Esempio:-

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");
        // Non possiamo aggiungere elementi diversi da Stringhe
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Output:-

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

Qui abbiamo creato un oggetto LinkedList con Generics e aggiunto 3 elementi. Quando proviamo ad aggiungere un Numero a LinkedList, si verifica un errore durante la compilazione.

Da Array a LinkedList in Java

In questa sezione, esploreremo come convertire un Array Java in un oggetto LinkedList. Possiamo farlo in molti modi, tuttavia ne ho fornito solo uno qui. Esempio:-


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);
	}
}

Output:-

[1, 2, 3, 4, 5]

Java LinkedList in Array

In questa sezione, esploreremo come convertire un LinkedList Java in un Array. Possiamo farlo in molti modi, tuttavia ne ho fornito solo uno qui. Esempio:-

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));

	}
}

Output:-

[1, 2, 3, 4, 5]

Casi d’uso in tempo reale di Java LinkedList

In questa sezione, discuteremo quali sono gli scenari migliori e peggiori da considerare nell’utilizzo di LinkedList nelle applicazioni Java. Miglior scenario d’uso:-

  • Quando l’operazione frequentemente utilizzata è l’aggiunta o la rimozione di elementi nel mezzo della lista, LinkedList è la migliore classe da utilizzare.

Perché? Perché non dobbiamo fare molte spostamenti per aggiungere o rimuovere elementi nel mezzo della lista. Si prega di fare riferimento alla sezione “Come funziona l’inserimento in Java LinkedList?” per capire dettagliatamente. Scenario peggiore:-

  • Quando la nostra operazione frequentemente utilizzata è il recupero di elementi da una lista, LinkedList è la scelta peggiore.

Perché? Perché LinkedList supporta solo l’accesso sequenziale, NON supporta l’accesso casuale. Si prega di fare riferimento alla sezione “Come funziona la cancellazione in Java LinkedList?” per capirlo in dettaglio. NOTA:- LinkedList implementa List, Deque, Cloneable e Serializable. Ma non implementa l’interfaccia RandomAccess.

Rappresentazione interna di Java LinkedList

Come sappiamo, internamente Java LinkedList è implementato utilizzando Doubly Linked List. Quindi Java LinkedList rappresenta i suoi elementi come nodi. Ogni nodo è diviso in 3 porzioni come mostrato di seguito. Qui ogni nodo è utilizzato per uno scopo specifico.

  1. La parte sinistra del nodo viene utilizzata per puntare al nodo (o elemento) precedente nella LinkedList.
  2. La parte destra del nodo viene utilizzata per puntare al nodo (o elemento) successivo nella LinkedList.
  3. La parte centrale del nodo viene utilizzata per memorizzare i dati effettivi.

NOTA:- In JVM, LinkedList NON memorizza i suoi elementi in ordine consecutivo. Memorizza i suoi elementi in qualsiasi spazio disponibile e li collega tra loro utilizzando le parti di nodo sinistra e destra come mostrato nel diagramma sottostante.

Come funziona l’inserimento in Java LinkedList?

Abbiamo già visto come LinkedList memorizza i suoi elementi come nodi nella sezione precedente. In questa sezione, discuteremo di come funziona internamente l’operazione di inserimento di Java LinkedList.

  1. Supponiamo che la nostra LinkedList iniziale abbia i seguenti dati.
    3. Esegui l’operazione di inserimento seguente su questa LinkedList
linkedList.add(2,54);

Qui stiamo cercando di eseguire l’operazione di inserimento per aggiungere un nuovo elemento con valore “54” all’indice 2.5. La LinkedList aggiornata sarà simile a quella seguente.

Come funziona la cancellazione in Java LinkedList?

Abbiamo già visto come LinkedList esegua internamente l’operazione di inserimento nella sezione precedente. In questa sezione, discuteremo di come funziona internamente l’operazione di cancellazione della LinkedList di Java.

  1. Supponiamo che la nostra LinkedList iniziale abbia i seguenti dati.
    3. Esegui l’operazione di inserimento seguente su questa LinkedList
linkedList.remove(3);

Qui stiamo cercando di eseguire l’operazione di cancellazione per eliminare un elemento disponibile all’indice 3.5. La LinkedList aggiornata appare come segue.

Operazioni di Deque della LinkedList di Java

Esploreremo come un oggetto LinkedList funziona come una Deque. Utilizziamo queste operazioni per implementare code o pile. Discuteremo approfonditamente come funzionano le pile o le code nei miei prossimi post. Esempio:-

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());	
  }
}

Output:-

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

Java SE 8: Da LinkedList a Stream in Java

Esploreremo come convertire un oggetto LinkedList nel concetto di Stream di Java SE 8. Esempio:-

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);
		
	//converti la lista in uno stream
	numbersList.stream().forEach(System.out::println);
  }
}

Output:-

1
2
3
4
5

Java SE 9 LinkedList

In Java SE 9, Oracle Corp sta per aggiungere alcuni utili metodi di utilità per creare una lista immutabile. Se desideri conoscerli in profondità con alcuni esempi utili, per favore leggi il mio post su: Java SE 9: Metodi Factory per Lista Immutabile Questo è tutto per un breve riepilogo su LinkedList in Java. Spero che questi esempi di Java LinkedList ti aiuteranno a iniziare con la programmazione LinkedList. Grazie per aver letto i miei tutorial. Per favore lasciami un commento se ti piacciono i miei tutorial o se hai problemi o suggerimenti o eventuali errori di battitura.

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