Guia para Apache Commons CircularFifoQueue

Guia para Apache Commons CircularFifoQueue

1. Visão geral

Neste tutorial rápido, daremos uma olhada na estrutura de dadosCircularFifoQueue fornecida no pacotecollections4.queue da biblioteca de coleções do Apache Commons.

CircularFifoQueue<E> implementa a interfaceQueue<E> e é umfixed-size,non-blocking queue -when you add an element to a queue that is full, the oldest element is removed to make room for the new element.

2. Dependência do Maven

Para projetos Maven, precisamos adicionar a dependência necessária:


    org.apache.commons
    commons-collections4
    4.1

Você pode encontrar a versão mais recente desta biblioteca emMaven Central.

3. Construtores

Para criar um objetoCircularFifoQueue, podemos usar o construtor padrão, que cria uma fila com o tamanho padrão de 32:

CircularFifoQueue bits = new CircularFifoQueue();

Se soubermos o tamanho máximo desejado de nossa fila, podemos usar o construtor que recebeint como argumento para especificar o tamanho:

CircularFifoQueue colors = new CircularFifoQueue<>(5);

Também existe a opção de criar um objetoCircularFifoQueue fornecendo ao construtor uma coleção como argumento.

Nesse caso, a fila será preenchida com os elementos da coleção e seu tamanho será o mesmo que o tamanho da coleção:

CircularFifoQueue daysOfWeek = new CircularFifoQueue<>(days);

Nota: como essa fila já está cheia quando construída, qualquer adição fará com que o primeiro elemento criado seja descartado.

4. Adicionando elementos

Como em qualquer implementação deQueue, podemos adicionar elementos usando os métodosaddeoffer. OQueue JavaDoc especifica que o métodooffer deve ser usado ao operar com uma fila com restrição de capacidade.

No entanto, comoCircularFifoQueue não é bloqueador, as inserções não podem falhar. Como resultado, seus métodosaddeoffer exibem o mesmo comportamento.

Vamos ver como podemos adicionar elementos à nossa filacolors usando o métodoadd:

colors.add("Red");
colors.add("Blue");
colors.add("Green");

E vamos adicionar alguns elementos usando o métodooffer:

colors.offer("White");
colors.offer("Black");

5. Removendo e Recuperando Elementos

A classeCircularFifoQueue nos oferece alguns métodos que podem ser úteis quando precisamos manipular os elementos da fila. Alguns métodos são usados ​​para obter elementos da fila, outros para remover elementos e outros para realizar as duas operações ao mesmo tempo.

5.1. MétodoPeek

O métodopeek não é destrutivo ereturns the head of the queue.

Este método sempre retornará o mesmo elemento, desde que não haja nenhuma alteração nos elementos na fila entre as chamadas. If the queue is empty, peek will return null:

String colorsHead = colors.peek();

5.2. MétodoElement

O métodoelement é semelhante apeek - itreturns the current head of the queue.

No entanto, o métodoelement lança uma exceção se a fila estiver vazia:

colorsHead = colors.element();

5.3. MétodoGet

Quando precisamos obter um determinado elemento da fila, podemos usar o métodoget. Este método usa o índice do elemento desejado como argumento. O índice da fila é baseado em zero.

Vamos pegar um elemento da filacolors que preenchemos com elementos anteriormente:

String color = colors.get(1);

Isso retornará “Blue“.

Agora vamos adicionar três elementos à nossa fila e verificar este resultado novamente:

colors.add("Orange");
colors.add("Violet");
colors.add("Pink");

color = colors.get(1);

Desta vez, o métodoget retorna “Black“. Isso ocorre porque nossa fila foi criada com um tamanho limitado de cinco, e os três primeiros elementos (“Red“, “Blue“, “Green“) foram removidos com a adição de os novos.

5.4. MétodoPoll

O métodopollremoves the head element of the queue and returns that element. Se a fila não tiver elementos, o métodopoll retornanull:

colorsHead = colors.poll();

5.5. MétodoRemove

The remove methodoperates much like the poll method - retorna o topo da fila e remove o elemento retornado. No entanto, if the queue is empty, remove will throw an exception:

colorsHead = colors.remove();

5.6. MétodoClear

Podemos usar o métodoclear quando quisermos esvaziar nossa fila:

colors.clear();

6. Métodos de verificação

Depois de ver como podemos adicionar, remover e recuperar elementos da fila, vamos ver o que a classe tem a oferecer em relação à verificação de seu tamanho e capacidade. Usaremos as filas criadas nas seções anteriores em nossos exemplos.

Em geral, temos à disposição dois métodos para verificar o tamanho da nossa fila - um para obter o tamanho máximo do objeto e outro para verificar a contagem atual de elementos.

O métodomaxSize retornará um valorinteger do tamanho máximo da fila:

int maxSize = bits.maxSize();

Isso retornará32, pois a filabits foi criada com o construtor padrão.

O métodosize retornará o número de elementos atualmente armazenados na fila:

int size = colors.size();

Para verificar a capacidade do objeto de fila, podemos usar os métodosisEmptyeisAtFullCapacity.

O métodoisEmpty retornará um valorboolean que indica se a fila está vazia ou não:

boolean isEmpty = bits.isEmpty();

Para verificar se nossa fila está cheia, podemos usarthe isAtFullCapacity method. Este métodoreturns true only if the maximum size of elements in the queue has been reached:

boolean isFull = daysOfWeek.isAtFullCapacity();

Você deve observar que este método éavailable as of version 4.1.

Outro método da interfaceQueue que podemos usar para verificar se nossa fila está cheia é o métodoisFull. ParaCircularFifoQueue,the isFull method will always return false, because the queue can always accept new elements:

boolean isFull = daysOfWeek.isFull();

7. Conclusão

Neste artigo, vimos como usar o Apache CommonsCircularFifoQueue. Vimos alguns exemplos que ilustram como instanciar um objeto de fila, como preenchê-lo, como esvaziá-lo, como obter e remover elementos dele e como verificar seu tamanho e capacidade.

Você pode encontrar o código de exemplo completo usado neste artigo em nossoGitHub project. Como é um projeto do Maven, você deve poder importá-lo e executá-lo como está.