在 java 中,哪个 LIFO 数据结构类允许我指定一个 MAX 项目大小,只要添加一个项目会导致它超过 MAX 大小,它就会自动丢弃旧项目。
问问题
1091 次
2 回答
3
您可以子类Stack
化以获得所需的行为。您只需要覆盖push()
以检查大小是否大于 N,并丢弃旧项目:
@Override
public void push(E elt) {
super.push(elt);
while (this.size() > this.maxSize) {
this.removeElementAt(this.size() - 1);
}
}
可能会接近你想要的。
于 2012-04-28T01:36:56.367 回答
0
Java中没有这样的结构。我希望这个自定义实现满足您的需求:
BlockingDeque<Object> deque = new LinkedBlockingDeque<Object>(32) {
public void push(Object e) {
final java.util.concurrent.locks.ReentrantLock lock;
try {
Field lockField = LinkedBlockingDeque.class.getDeclaredField("lock");
lockField.setAccessible(true);
lock = (ReentrantLock) lockField.get(this);
} catch (NoSuchFieldException e1) {
throw new RuntimeException(e1);
} catch (SecurityException e1) {
throw new RuntimeException(e1);
} catch (IllegalArgumentException e1) {
throw new RuntimeException(e1);
} catch (IllegalAccessException e1) {
throw new RuntimeException(e1);
}
lock.lock();
try {
if (!offerFirst(e)) {
pollLast();
offerFirst(e);
}
} finally {
lock.unlock();
}
}
};
然后你像 Stack 一样使用它(Deque 替换了旧的 Stack 类):
deque.push(new Object());
Object o = deque.pop();
对不起所有的锁东西,但需要避免不一致。
于 2012-04-28T03:08:32.920 回答