Apache Commons CircularFifoQueue指南

1.概述

在本快速教程中,我們將看看Apache Commons Collections庫的collections4.queue包中提供的CircularFifoQueue數據結構

CircularFifoQueue 實現Queue 接口,並且是固定大小**的無阻塞隊列-當您將元素添加到已滿的隊列時,最舊的元素將被刪除以為新元素騰出空間

2. Maven依賴

對於Maven項目,我們需要添加所需的依賴項:

<dependency>

 <groupId>org.apache.commons</groupId>

 <artifactId>commons-collections4</artifactId>

 <version>4.1</version>

 </dependency>

您可以在Maven Central上找到該庫的最新版本。

3.構造函數

要創建CircularFifoQueue對象,我們可以使用默認構造函數,該構造函數創建默認大小為32的隊列:

CircularFifoQueue<String> bits = new CircularFifoQueue();

如果我們知道所需的隊列最大大小,則可以使用將int作為參數指定大小的構造函數:

CircularFifoQueue<String> colors = new CircularFifoQueue<>(5);

還有一個選項,可以通過向構造函數提供一個集合作為參數來創建CircularFifoQueue對象。

在這種情況下,隊列將使用集合的元素填充,並且隊列的大小將與集合的大小相同:

CircularFifoQueue<String> daysOfWeek = new CircularFifoQueue<>(days);

注意:由於此隊列在構造時已滿,因此任何添加都會導致第一個創建的元素被丟棄。

4.添加元素

與任何Queue實現一樣,我們可以使用addoffer方法添加元素。隊列JavaDoc指定與容量受限的隊列一起使用時,將使用offer方法。

但是,由於CircularFifoQueue是非阻塞的,因此插入不會失敗。結果,它的添加提供方法表現出相同的行為。

讓我們看看如何使用add方法將元素添加到顏色隊列中:

colors.add("Red");

 colors.add("Blue");

 colors.add("Green");

讓我們使用offer方法添加一些元素:

colors.offer("White");

 colors.offer("Black");

5.刪除和檢索元素

CircularFifoQueue類為我們提供了一些方法,這些方法在需要操縱隊列的元素時很有用。有些方法用於從隊列中獲取元素,有些方法用於刪除元素,有些方法用於同時執行兩個操作。

5.1。peek方法

peek方法是非破壞性的,它返回隊列的頭部

只要兩次調用之間的隊列中的元素沒有任何更改,此方法將始終返回相同的元素。如果隊列為空,則peek將返回null:

String colorsHead = colors.peek();

5.2。element方法

element方法類似於peek -它返回隊列的當前頭

但是,如果隊列為空,則element方法將引發異常:

colorsHead = colors.element();

5.3。get方法

當我們需要從隊列中獲取某個元素時,可以使用get方法。此方法將所需元素的索引作為參數。隊列的索引從零開始。

讓我們從前面填充元素的顏色隊列中獲取一個元素:

String color = colors.get(1);

這將返回“ Blue ”。

現在,我們將三個元素添加到隊列中,然後再次檢查此結果:

colors.add("Orange");

 colors.add("Violet");

 colors.add("Pink");





 color = colors.get(1);

這次, get方法返回“ Black ”。這是因為創建的隊列的大小限制為五個,並且刪除了前三個元素(“紅色”,“藍色”,“綠色”),並添加了新元素。

5.4。poll

poll方法刪除隊列的head元素並返回該元素。如果隊列中沒有元素,則poll方法返回null:

colorsHead = colors.poll();

5.5。remove方法

remove方法的**操作與poll方法非常相似,它返回隊列的開頭並刪除返回的元素。但是,如果隊列為空,則remove將引發異常**:

colorsHead = colors.remove();

5.6。清除方法

當我們想清空隊列時,可以使用clear方法:

colors.clear();

6.檢查方法

在了解瞭如何添加,刪除和檢索隊列元素之後,讓我們看看該類在檢查其大小和容量方面所提供的內容。在示例中,我們將使用在前面各節中創建的隊列。

通常,我們有兩種檢查隊列大小的方法-一種用於獲取對象的最大大小,一種用於檢查其當前元素計數。

maxSize方法將返回隊列最大大小的數值:

int maxSize = bits.maxSize();

這將返回32 ,因為使用默認構造函數創建了隊列。

size方法將返回當前存儲在隊列中的元素數:

int size = colors.size();

要檢查隊列對象的容量,我們可以使用isEmptyisAtFullCapacity方法。

isEmpty方法將返回一個布爾值,該值指示隊列是否為空:

boolean isEmpty = bits.isEmpty();

要檢查隊列是否已滿,可以使用**isAtFullCapacity方法僅在達到隊列中元素的最大大小時,此方法才返回true**

boolean isFull = daysOfWeek.isAtFullCapacity();

您應該注意,此方法從4.1版本開始可用

可以用來檢查隊列是否已滿的Queue接口的另一種方法是isFull方法。對於CircularFifoQueueisFull方法將始終返回false,因為隊列始終可以接受新元素

boolean isFull = daysOfWeek.isFull();

7.結論

在本文中,我們看到瞭如何使用Apache Commons CircularFifoQueue 。我們看到了一些示例,這些示例說明瞭如何實例化隊列對象,如何填充隊列對象,如何將其清空,如何從中獲取和刪除元素以及如何檢查其大小和容量。

您可以在我們的GitHub項目找到本文中使用的完整示例代碼。這是一個Maven項目,因此您應該能夠將其導入並按原樣運行。