Mav*_*rik 105
实际上LinkedHashMap完全符合你的要求.您需要覆盖该removeEldestEntry方法.
具有最多10个元素的队列示例:
queue = new LinkedHashMap<Integer, String>()
{
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest)
{
return this.size() > 10;
}
};
Run Code Online (Sandbox Code Playgroud)
如果"removeEldestEntry"返回true,则从地图中删除最旧的条目.
Roa*_*tad 18
我只是这样实现了一个固定大小的队列:
public class LimitedSizeQueue<K> extends ArrayList<K> {
private int maxSize;
public LimitedSizeQueue(int size){
this.maxSize = size;
}
public boolean add(K k){
boolean r = super.add(k);
if (size() > maxSize){
removeRange(0, size() - maxSize);
}
return r;
}
public K getYoungest() {
return get(size() - 1);
}
public K getOldest() {
return get(0);
}
}
Run Code Online (Sandbox Code Playgroud)
mor*_*itz 17
Java语言和运行时中没有现有的实现.所有队列都扩展了AbstractQueue,其文档明确指出,向完整队列添加元素始终以异常结束.最好(并且非常简单)将Queue包装到您自己的类中以获得所需的功能.
再一次,因为所有队列都是AbstractQueue的子代,所以只需将其作为内部数据类型使用,您应该在几乎没有时间运行灵活的实现:-)
更新:
如下所述,有两个可用的开放实现(这个答案很老,伙计们!),详情请参阅此答案.
Leo*_*eon 10
public class CircularQueue<E> extends LinkedList<E> {
private final int capacity;
public CircularQueue(int capacity){
this.capacity = capacity;
}
@Override
public boolean add(E e) {
if(size() >= capacity)
removeFirst();
return super.add(e);
}
}
Run Code Online (Sandbox Code Playgroud)
使用方法及测试结果:
public static void main(String[] args) {
CircularQueue<String> queue = new CircularQueue<>(3);
queue.add("a");
queue.add("b");
queue.add("c");
System.out.println(queue.toString()); //[a, b, c]
String first = queue.pollFirst(); //a
System.out.println(queue.toString()); //[b,c]
queue.add("d");
queue.add("e");
queue.add("f");
System.out.println(queue.toString()); //[d, e, f]
}
Run Code Online (Sandbox Code Playgroud)
这就是我用Queue包裹做的LinkedList,固定尺寸我在这里给的是2;
public static Queue<String> pageQueue;
pageQueue = new LinkedList<String>(){
private static final long serialVersionUID = -6707803882461262867L;
public boolean add(String object) {
boolean result;
if(this.size() < 2)
result = super.add(object);
else
{
super.removeFirst();
result = super.add(object);
}
return result;
}
};
....
TMarket.pageQueue.add("ScreenOne");
....
TMarket.pageQueue.add("ScreenTwo");
.....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62269 次 |
| 最近记录: |