Qual é a diferença entre o método poll () e remove () de uma fila

A fila mantém elementos antes de serem processados. Usando operações de adição, como adicionar, oferecer e colocar, o produtor de elementos pode adicioná-los à fila. Usando operações de remoção como remover, pesquisar e receber, o consumidor de elementos pode obter e remover elementos da fila.

Quando o produtor adiciona um elemento em que posição na fila o elemento é armazenado e quando o consumidor remove um elemento da fila, o elemento que ele obtém depende da ordem em que a fila mantém.

A estrutura de coleta Java fornece diferentes implementações de Fila, há filas que ordenam elementos primeiro a entrar, primeiro a sair (FIFO), último a entrar, primeiro a sair (LIFO), em ordem natural ou usando o comparador fornecido.

Na ordem FIFO, a fila é movida pela primeira vez para a posição principal, para que as operações de remoção possam obtê-la. Enquanto novos itens por operações de adição são adicionados à cauda.

Para exemplos, veja

Tutorial da fila de coleções Java

Qualquer coisa que implemente a interface da Fila e use a semântica FIFO. Uma escolha comum é LinkedList.

Fila fila = LinkedList <> ();queue.insert (1);queue.insert (2);while (! queue.isEmpty ()) { System.out.println (fila.poll ());}// Saídas "1 2"

Quero enfatizar especificamente que a própria interface da fila não garante a semântica FIFO. Ele fornece apenas meios para armazenar algo até que precise ser processado. Notavelmente, as pilhas são LIFO e as filas de prioridade podem classificar itens por alguns critérios antes de serem recuperados. Você deve verificar a classe de implementação para verificar qual semântica ela possui.

De um modo geral, o que você realmente quer dizer com fila? Uma linha, certo? Você saberia, agora não? Quantas vezes na sua vida você foi forçado a ficar em uma fila que mal se movia. Então, como foi? Não é a experiência. Eu sei que deve ter sido uma merda. Quero dizer o comportamento da fila?

Se você se lembra da primeira pessoa a entrar na fila, é a primeira a sair também assim que seu trabalho é concluído. Esse tipo de configuração de “primeiro a entrar, primeiro a sair” também é popularmente abreviado como

FIFO

. Portanto, com isso, estabelecemos que uma fila segue um FIFO.

Uma fila em Java não é diferente. Segue FIFO, o que significa que ele solicita elementos com base no primeiro a entrar, primeiro a sair. Portanto, o primeiro elemento é removido primeiro e o último elemento é removido por último.

Interface de fila

Como você já deve ter adivinhado, a fila em Java é uma interface que estende a interface de coleção. Existem apenas seis métodos aqui e eles são:

  1. add (Objeto e)
  2. oferta (Objeto e)
  3. elemento()
  4. olhadinha()
  5. votação()
  6. retirar()

Os quatro últimos métodos, a saber, element (), peek (), poll () e remove (), mais ou menos, fazem a mesma coisa - recupera o cabeçalho da fila. Desses quatro, os dois últimos, a saber: poll () e remove (), também removem a cabeça da fila.

NOTA: Uma fila não permite a inserção de elementos nulos. Duplicatas são permitidas na fila.

Como não podemos instanciar uma interface, usaremos uma de suas classes herdadas para ver todos os métodos mencionados em um exemplo. Existem duas classes que implementam a interface da fila e são elas:

  • LinkedList
  • Fila de prioridade

Então, escrevendo:

Fila q = novo LinkedList ();

ou

Fila q = novo PriorityQueue ();

estariam ambos corretos.

Uma das classes cruciais que herdam os métodos da Interface da fila é o PriorityQueue, que é o nosso próximo tópico.

Classe Java da fila prioritária

Fila prioritária Java ou PriorityQueue Class é uma daquelas classes que implementam a interface da fila. Ele estende a classe AbstractQueue, que por sua vez implementa o Queue para aproveitar seus benefícios.

Aqui está um diagrama hierárquico que explica as coisas de uma maneira muito melhor:

A classe PriorityQueue tem a facilidade de usar a fila em Java. No entanto, surpreendentemente, ele não ordena elementos à maneira FIFO. Ele solicita elementos com base no pedido natural do elemento ou no comparador fornecido.

Construtores e métodos PriorityQueue

Aqui estão os construtores do PriorityQueue que você pode usar:

  1. Fila de prioridade()
  2. PriorityQueue (Coleção c)
  3. PriorityQueue (capacidade int)
  4. PriorityQueue (capacidade int, comparador comparador)
  5. PriorityQueue (PriorityQueue p)
  6. PriorityQueue (SortedSet s)

Os métodos da classe PriorityQueue que você pode usar são:

  1. add (Objeto e)
  2. Claro()
  3. comparador()
  4. contém (Objeto o)
  5. iterador ()
  6. oferta (Objeto e)
  7. olhadinha()
  8. votação()
  9. remove (Objeto o)
  10. Tamanho()
  11. toArray ()
  12. toArray (T [] a)

Exemplo Java da fila de prioridade

Aqui um exemplo seria útil:

Fila de prioridade q = new PriorityQueue (5)q.add (23); q.add (1); q.add (3); q.add (7);q.ferramenta (6); // faz o mesmo que adicionarSystem.out.println (q);

Observe aqui que o método offer () da Queue Interface faz a mesma coisa que add (). Se você executar o programa acima, receberá:

[1, 6, 3, 23, 7]

Como você pode ver, os elementos são ordenados conforme sua ordem natural. Não segue nenhum FIFO aqui.

Leia o artigo completo aqui:

Fila em Java | Fila prioritária Java | FIFO da fila Java - parte 2

A interface da fila estende a coleção e declara o comportamento de uma fila, que geralmente é uma lista de primeiro a entrar, primeiro a sair. No entanto, existem tipos de filas nas quais o ou dering se baseia em outros critérios. Fila é uma interface genérica que possui esta declaração:

fila de interface

A fila oferece vários pontos de interesse. Primeiro, os elementos só podem ser removidos da cabeça da fila. Segundo, existem dois métodos que obtêm e removem elementos: poll () e remove (). A diferença entre eles é que poll () retorna nulo se a fila estiver vazia, mas remove () lança uma exceção. Terceiro, existem dois métodos, element () e peek (), que obtêm, mas não removem, o elemento no início da fila. Eles diferem apenas nesse elemento () lança uma exceção se a fila estiver vazia, mas peek () retorna nulo. Por fim, observe que offer () tenta apenas adicionar um elemento a uma fila. Como algumas filas têm um comprimento fixo e podem estar cheias, offer () pode falhar.