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.