Dúvida em relação aos metodos de uma LinkedList

Sou iniciante em programação e em Java e estou estudando coleções e acabei me deparando com alguns métodos da LinkedList.

Aparentemente os métodos removeFirst(), poll(), pollFirst() e pop() fazem a mesma coisa: retornam e removem o primeiro elemento de uma lista.

O mesmo acontece com os métodos getFirst(), element(), peek() e peekFirst(). Todos retornam o primeiro elemento da lista.

Há alguma diferença entre esses métodos? Se sim, qual? Se não, por que a necessidade de tantos métodos diferentes para realizar a mesma função?

Os métodos pool, remove, element e peek vêm da interface Queue (que LinkedList implementa). Como esta interface representa uma fila (first in, first out), todos os seus métodos operam sobre o primeiro elemento, e por isso não seria necessário especificar isso em seus nomes.

Ou seja, todos os métodos abaixo são da interface Queue e retornam o primeiro elemento da fila, a diferença está nos detalhes:

método remove o elemento? o que faz se a fila é vazia
remove sim lança exceção
pool sim retorna null
element não lança exceção
peek não retorna null

O problema é que LinkedList implementa a interface Deque, que herda de Queue (e portanto também tem os métodos acima), mas adiciona os métodos que operam sobre o final da lista (como getLast e peekLast). Só que um Deque também pode ser usado como uma pilha (last in last out), então possui métodos que operam sobre o último elemento (sem precisar ser redundante com Last no nome) e que usam terminologia própria de pilhas (como push e pop).

Meu palpite é que, provavelmente para não deixar a classe muito confusa (“Por que existe xxxLast mas não xxxFirst?”), acabaram adicionando os métodos xxxFirst. A própria documentação cita que vários deles são equivalentes.

Tanto que, se você olhar o código fonte do OpenJDK, verá que o método element acaba chamando getFirst:

public E element() {
    return getFirst();
}

A diferença entre alguns métodos é similar ao que acontece com Queue: alguns lançam exceção quando a lista é vazia (getFirst, getLast), enquanto outros retornam null (peek, pool).


Ou seja, como LinkedList implementa uma interface que possui métodos de pilha e fila, além de métodos específicos que operam sobre o primeiro e último elemento, acabou tendo vários métodos diferentes que acabam sendo equivalentes.

O motivo desta “bagunça” provavelmente tem a ver com razões históricas, pela forma como a própria classe foi sendo alterada a cada versão da linguagem. Ver aqui para mais detalhes.

2 curtidas