[英]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方法,以便它
(以及構造函數)。
如果您希望在插入時將其阻塞(如果已滿),則是另一回事。
看起來您想要的是有限大小的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.