Um guia para o Java LinkedList
1. Introdução
LinkedList é uma implementação de lista duplamente vinculada das interfacesListeDeque. Ele implementa todas as operações de lista opcionais e permite todos os elementos (incluindonull).
2. Recursos
Abaixo você pode encontrar as propriedades mais importantes deLinkedList:
-
As operações indexadas na lista percorrerão a lista desde o início ou o final, o que estiver mais próximo do índice especificado
-
Não ésynchronized
-
Seus iteradoresIteratoreListIterator sãofail-fast (o que significa que após a criação do iterador, se a lista for modificada, umConcurrentModificationException será lançado)
-
Cada elemento é um nó, que mantém uma referência aos próximos e anteriores
-
Mantém o pedido de inserção
EmboraLinkedList não esteja sincronizado, podemos recuperar uma versão sincronizada dele chamando o métodoCollections.synchronizedList, como:
List list = Collections.synchronizedList(new LinkedList(...));
3. Comparação comArrayList
Embora ambos implementem a interfaceList, eles têm semânticas diferentes - o que definitivamente afetará a decisão de qual usar.
3.1. Estrutura
UmArrayList é uma estrutura de dados baseada em índice apoiada por umArray. Ele fornece acesso aleatório aos seus elementos com desempenho igual a O (1).
Por outro lado, aLinkedList armazena seus dados como uma lista de elementos e cada elemento é vinculado ao seu elemento anterior e seguinte. Nesse caso, a operação de pesquisa de um item tem tempo de execução igual a O (n).
3.2. Operações
As operações de inserção, adição e remoção de um item são mais rápidas emLinkedList porque não há necessidade de redimensionar uma matriz ou atualizar o índice quando um elemento é adicionado a alguma posição arbitrária dentro da coleção, apenas referências nos elementos circundantes vai mudar.
3.3. Uso de memória
UmLinkedList consome mais memória do que umArrayList porque cada nó em umLinkedList armazena duas referências, uma para seu elemento anterior e outra para seu próximo elemento, enquantoArrayList mantém apenas dados e seu índice.
4. Uso
Aqui estão alguns exemplos de código que mostram como você pode usarLinkedList:
4.1. Criação
LinkedList
4.2. Adicionando Elemento
LinkedList implementa a interfaceListeDeque, além dos métodosadd()eaddAll() padrão, você pode encontraraddFirst()eaddLast(), que adiciona um elemento no início ou no final, respectivamente.
4.3. Removendo Elemento
Similarmente à adição de elemento, esta implementação de lista ofereceremoveFirst() eremoveLast().
Além disso, há o método convenienteremoveFirstOccurence()eremoveLastOccurence() que retorna booleano (verdadeiro se a coleção contiver o elemento especificado).
4.4. Operações de fila
A interfaceDeque fornece comportamentos semelhantes aos de fila (na verdade,Deque estende a interfaceQueue):
linkedList.poll();
linkedList.pop();
Esses métodos recuperam o primeiro elemento e o removem da lista.
A diferença entrepoll() epop() é quepop lançaráNoSuchElementException() na lista vazia, enquantopoll retorna nulo. As APIspollFirst() epollLast() também estão disponíveis.
Veja, por exemplo, como funciona a APIpush:
linkedList.push(Object o);
Que insere o elemento como a cabeça da coleção.
LinkedList tem muitos outros métodos, a maioria dos quais deve ser familiar para um usuário que já usouLists. Outros fornecidos porDeque podem ser uma alternativa conveniente aos métodos “padrão”.
A documentação completa pode ser encontradahere.
5. Conclusão
ArrayList é geralmente a implementação padrão deList.
No entanto, existem certos casos de uso em que o uso deLinkedList será um ajuste melhor, como preferências por tempo de inserção / exclusão constante (por exemplo, inserções / exclusões / atualizações frequentes), tempo de acesso constante e uso de memória eficaz.
As amostras de código podem ser encontradasover on GitHub.