簡體   English   中英

在Java中使用哪個Queue實現?

[英]Which Queue implementation to use in Java?

我需要在應用程序中使用FIFO結構。 它最多需要包含5個元素。 我想要一個易於使用的東西(我不在乎並發性)來實現Collection接口。

我嘗試了LinkedList,它似乎來自Queue,但似乎不允許我設置其最大容量。 感覺好像我只想要最多5個元素,但嘗試添加20個元素,它只會不斷增加大小以適合它。 我想要一些可以通過以下方式工作的東西:

XQueue<Integer> queue = new XQueue<Integer>(5); //where 5 is the maximum number of elements I want in my queue.
for (int i = 0; i < 10; ++i) {
    queue.offer(i);
}

for (int i = 0; i < 5; ++i) {
    System.out.println(queue.poll());
}

打印:

5
6
7
8
9

謝謝

創建自己想要的子類,並覆蓋add方法,以便它

  • 檢查新對象是否適合,否則檢查失敗
  • 調用super.add()

(以及構造函數)。

如果您希望在插入時將其阻塞(如果已滿),則是另一回事。

看起來您想要的是有限大小的FIFO結構,該結構在添加新項目時會將最舊的項目逐出。 我建議基於循環數組實現的解決方案,在該解決方案中,您應該跟蹤隊列尾部和隊列頭的索引,並根據需要(以循環方式)增加它們。

編輯:這是我的實現(請注意,這是一個集合)。 它與您的測試方案配合良好。

public class XQueue <T> extends AbstractQueue<T>{
    private T[] arr;
    private int headPos;
    private int tailPos;
    private int size;

    @SuppressWarnings("unchecked")
    public XQueue(int n){
        arr = (T[]) new Object[n];
    }

    private int nextPos(int pos){
        return (pos + 1) % arr.length;
    }

    @Override
    public T peek() {
        if (size == 0)
            return null;
        return arr[headPos];
    }

    public T poll(){
        if (size == 0)
            return null;
        size--;
        T res = arr[headPos];
        headPos = nextPos(headPos);     
        return res;
    }

    @Override
    public boolean offer(T e) {
        if (size < arr.length)
            size++;
        else
            if (headPos == tailPos)
                headPos = nextPos(headPos);
        arr[tailPos] = e;
        tailPos = nextPos(tailPos);
        return true;
    }

    @Override
    public Iterator<T> iterator() {
        return null; //TODO: Implement
    }

    @Override
    public int size() {
        return size;
    }
}

我沒有在API中看到任何類似的限制。 您可以通過使用匿名類功能更改add方法的行為來使用ArrayList:

new ArrayList<Object>(){
    public boolean add(Object o){ /*...*/ }
}

也許ArrayBlockingQueue可以解決問題。 這里 嘗試這樣的事情:

BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5);

for (int i = 0; i < 10; i++) {
  while (!queue.offer(i)) {
    queue.poll();        
  }
}

for (int i = 0; i < 5; i++) {   
  System.out.println(queue.poll());
}

你有三個選擇

1) 子類化一個抽象集合

2)將大小限制為5,並在執行插入操作的代碼周圍進行邏輯處理。

3)使用LinkedListHashMap可以重寫removeEldestEntry(Map.Entry)方法,以強加一個策略,以便在將新映射添加到地圖時自動刪除陳舊的映射。 (然后,您將使用迭代器來獲取值-它將按插入順序返回)

最好的選擇是#1-如果您查看鏈接,這真的很容易。

您看過Apache Commons Collections庫嗎? BoundedFifoBuffer應該完全滿足您的需求。

如果我沒記錯的話,我已經完全使用LinkedList完成了您想要的操作。

您需要做的是檢查List的大小,如果它是5,並且要添加對象,則刪除第一個元素,如果大小是5,則繼續這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM