Java LinkedList – LinkedList em Java

Java LinkedList é uma implementação das interfaces List e Deque. É uma das classes de implementação de List frequentemente utilizadas. Estende AbstractSequentialList e implementa as interfaces List e Deque. É uma coleção ordenada e suporta elementos duplicados. Armazena elementos na ordem de inserção. Suporta adição de elementos nulos. Suporta operações baseadas em índice. Se você quiser aprender mais sobre os conceitos básicos de List, por favor, leia este post: Java List.

Sumário do Post

Neste post, vamos discutir os seguintes conceitos:

  • Java LinkedList
  • Diagrama de Classe da Classe Java LinkedList
  • Métodos da Lista Java LinkedList
  • Métodos Deque da LinkedList Java
  • Exemplo Básico da LinkedList Java
  • Genéricos da LinkedList Java
  • Array Java para LinkedList
  • LinkedList Java para Array
  • Aplicações em Tempo Real da LinkedList Java
  • Representação Interna da LinkedList Java
  • Como a Inserção Funciona na LinkedList Java?
  • Como a Exclusão Funciona na LinkedList Java?
  • Operações Deque da LinkedList Java
  • Java SE 8: Java LinkedList para Stream
  • Java SE 9 LinkedList

Java LinkedList

Nesta seção, discutiremos alguns dos pontos importantes sobre Java LinkedList:

  • A classe Java LinkedList é um membro do Framework de Coleções do Java.
  • É uma implementação das interfaces List e Deque.
  • Internamente, é implementada usando a Estrutura de Dados Lista Duplamente Encadeada.
  • Suporta elementos duplicados.
  • Armazena ou mantém seus elementos em ordem de inserção.
  • Podemos adicionar qualquer número de elementos nulos.
  • Não é sincronizada, o que significa que não é segura para threads.
  • Podemos criar uma LinkedList sincronizada usando o método Collections.synchronizedList().
  • Nas aplicações Java, podemos usá-la como uma Lista, pilha ou fila.
  • Não implementa a interface RandomAccess. Portanto, só podemos acessar elementos em ordem sequencial. Não suporta o acesso aleatório aos elementos.
  • Quando tentamos acessar um elemento de uma LinkedList, a busca por esse elemento começa do início ou do final da LinkedList, dependendo de onde esse elemento está disponível.
  • Podemos usar ListIterator para iterar elementos LinkedList.
  • A partir do Java SE 8 em diante, podemos converter uma LinkedList em um Stream e vice-versa.
  • O Java SE 9 irá adicionar alguns métodos de fábrica para criar uma LinkedList Imutável.

Diagrama de Classe LinkedList em Java

Como sabemos, LinkedList em Java é uma das classes de implementação de Lista. Ela também implementa Deque. Como mostrado no diagrama de classe abaixo, ela NÃO estende diretamente da classe AbstractList. Ela estende a classe AbstractSequentialList.

Métodos da Lista LinkedList em Java

Nesta seção, discutiremos alguns dos métodos úteis e frequentemente utilizados da LinkedList em Java. Os seguintes métodos são herdados da interface List ou Collection:

  1. int size(): para obter o número de elementos na lista.
  2. boolean isEmpty(): para verificar se a lista está vazia ou não.
  3. boolean contains(Object o): Retorna true se esta lista contiver o elemento especificado.
  4. Iterator iterator(): Retorna um iterador sobre os elementos nesta lista na sequência apropriada.
  5. Object[] toArray(): Retorna um array contendo todos os elementos nesta lista na sequência apropriada.
  6. boolean add(E e): Anexa o elemento especificado ao final desta lista.
  7. boolean remove(Object o): Remove a primeira ocorrência do elemento especificado desta lista.
  8. boolean retainAll(Collection c): Retém apenas os elementos nesta lista que estão contidos na coleção especificada.
  9. void clear(): Remove todos os elementos da 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(): Retorna um iterador de lista sobre os elementos na lista.
  13. List subList(int fromIndex, int toIndex): Retorna uma visão da porção desta lista entre o fromIndex especificado, inclusivo, e o toIndex, exclusivo. A lista retornada é suportada por esta lista, portanto, alterações não estruturais na lista retornada são refletidas nesta lista, e vice-versa.

Métodos de LinkedList Deque em Java

Os seguintes métodos são específicos para a classe LinkedList, que são herdados da interface Deque:

  1. void addFirst(E e): Insere o elemento especificado no início desta lista.
  2. void addLast(E e): Insere o elemento especificado no final desta 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): Insere o elemento especificado no início desta lista.
  8. boolean offerLast(E e): Insere o elemento especificado no final desta 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.

Exemplo Básico de LinkedList em Java

Nesta seção, discutiremos sobre o exemplo básico de Java LinkedList. Exploraremos algumas operações mais úteis nas próximas seções. Exemplo:-

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

Saída:-

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

Aqui criamos um objeto LinkedList e adicionamos 4 itens. Como discutimos, o método LinkedList.size() é usado para obter o número de elementos na lista. NOTA:- Sem o uso de Generics, o Java LinkedList suporta elementos heterogêneos. No entanto, não é recomendado usar Collections sem Generics. Vamos explorar as vantagens e o uso de Java Generics na próxima seção com um exemplo simples.

Java LinkedList Generics

Nesta seção, discutiremos como usar Generics com Java LinkedList. Como sabemos, os Generics do Java são úteis para escrever programação com Segurança de Tipo e realizar verificações de tipo mais fortes em tempo de compilação. Eles também são úteis para eliminar a sobrecarga de cast. Exemplo:-

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");
        // Não podemos adicionar nada além de Strings
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Saída:-

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

Aqui criamos um objeto LinkedList com Generics e adicionamos 3 itens. Quando tentamos adicionar um Número à LinkedList, ocorre um erro de compilação.

Java Array para LinkedList

Nesta seção, vamos explorar como converter um Array Java em um objeto LinkedList. Podemos fazê-lo de várias maneiras, no entanto, aqui eu forneci apenas uma abordagem. Exemplo:-


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

Saída:-

[1, 2, 3, 4, 5]

Java LinkedList para Array

Nesta seção, vamos explorar como converter um LinkedList Java em um Array. Podemos fazê-lo de várias maneiras, no entanto, aqui eu forneci apenas uma abordagem. Exemplo:-

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

	}
}

Saída:-

[1, 2, 3, 4, 5]

Cenários de Uso em Tempo Real do Java LinkedList

Nesta seção, discutiremos sobre quais são os melhores e piores cenários de uso do LinkedList em aplicações Java. Cenário de Uso Melhor:-

  • Quando nossa operação frequentemente utilizada é adicionar ou remover elementos no meio da lista, LinkedList é a melhor classe para usar.

Por quê? Porque não precisamos fazer mais deslocamentos para adicionar ou remover elementos no meio da lista. Por favor, consulte a seção “Como a Inserção Funciona em Java LinkedList?” para entender detalhadamente. Cenário de Uso Pior:-

  • Quando nossa operação frequentemente utilizada é a recuperação de elementos de uma lista, então a LinkedList é a pior escolha.

Por quê? Porque a LinkedList suporta apenas acesso sequencial, NÃO suporta acesso aleatório. Consulte a seção “Como funciona a exclusão na LinkedList do Java?” para entender detalhadamente.NOTA:- A LinkedList implementa List, Deque, Cloneable e Serializable. Mas NÃO implementa a interface RandomAccess.

Representação Interna da LinkedList do Java

Como sabemos, internamente a LinkedList do Java é implementada usando Lista Duplamente Encadeada. Assim, a LinkedList do Java representa seus elementos como Nós. Cada Nó é dividido em 3 partes, como mostrado abaixo. Aqui, cada Nó é usado para um propósito específico.

  1. A parte do Nó do lado esquerdo é usada para apontar para o Nó (ou Elemento) anterior na LinkedList.
  2. A parte do Nó do lado direito é usada para apontar para o próximo Nó (ou Elemento) na LinkedList.
  3. A parte central do Nó é usada para armazenar os dados reais.

NOTA:- Na JVM, LinkedList NÃO armazena seus elementos em ordem consecutiva. Ele armazena seus elementos em qualquer espaço disponível e eles são conectados entre si usando as porções de Nós do lado Esquerdo e Direito, como mostrado no diagrama abaixo.

Como funciona a inserção na LinkedList do Java?

Já vimos como a LinkedList armazena seus elementos como Nós na seção anterior. Nesta seção, discutiremos como a operação de inserção da LinkedList do Java funciona internamente.

  1. Vamos assumir que nossa LinkedList inicial tem os seguintes dados.
    3. Execute a seguinte operação de inserção nesta LinkedList
linkedList.add(2,54);

Aqui estamos tentando realizar a operação de inserção para adicionar um novo elemento com o valor “54” no índice 2.5. A LinkedList atualizada parece assim.

Como funciona a exclusão na LinkedList do Java?

Já vimos como a LinkedList realiza a operação de Inserção internamente na seção anterior. Nesta seção, discutiremos como a operação de Exclusão da LinkedList em Java funciona internamente.

  1. Vamos assumir que nossa LinkedList inicial possui os seguintes dados.
    3. Realize a seguinte operação de Inserção nesta LinkedList
linkedList.remove(3);

Aqui estamos tentando realizar a operação de Exclusão para excluir um elemento que está disponível no índice 3,5. A LinkedList atualizada parece com abaixo.

Operações de Deque da LinkedList em Java

Aqui exploraremos como um objeto LinkedList funciona como um Deque. Utilizamos essas operações para implementar Filas ou Pilhas. Discutiremos como uma Pilha ou Fila funciona em detalhes em minhas próximas postagens. Exemplo:-

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

Saída:-

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

Java SE 8: Java LinkedList para Stream

Aqui exploraremos como converter um objeto LinkedList para o conceito de Stream do Java SE 8. Exemplo:-

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);
		
	//converter Lista para stream
	numbersList.stream().forEach(System.out::println);
  }
}

Output:-

1
2
3
4
5

Java SE 9 LinkedList

No Java SE 9, a Oracle Corp vai adicionar alguns métodos de utilidade úteis para criar uma Lista Imutável. Se você quiser aprendê-los a fundo com alguns exemplos úteis, por favor, leia minha postagem em: Métodos de Fábrica para Lista Imutável no Java SE 9. Isso resume rapidamente sobre LinkedList no Java. Espero que esses exemplos de LinkedList em Java ajudem você a começar com a programação de LinkedList. Obrigado por ler meus tutoriais. Por favor, deixe um comentário se você gostou dos meus tutoriais ou se tiver algum problema, sugestão ou erro tipográfico.

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