Collections java中的有限大小集合

Collections java中的有限大小集合,collections,java-8,Collections,Java 8,如果我想要类似的东西,我应该使用java中的哪种集合类型 我有一个列表,我想将列表的大小限制为“100”。因此,如果我在列表中添加第101个元素,第一个元素应该被自动删除(FIFO)。例如: List<Item> items = ??; items.add(item_1); ... items.add(item_101); // implicitly calls items.remove(0); items.add(item_102); // implicitly calls ite

如果我想要类似的东西,我应该使用java中的哪种集合类型

我有一个列表,我想将列表的大小限制为“100”。因此,如果我在列表中添加第101个元素,第一个元素应该被自动删除(FIFO)。例如:

List<Item> items = ??;
items.add(item_1);
...
items.add(item_101); // implicitly calls items.remove(0);
items.add(item_102); // implicitly calls items.remove(0);
列表项=??;
项目。添加(项目1);
...
项目。添加(项目_101);//隐式调用项。删除(0);
添加(第102项);//隐式调用项。删除(0);

你可以试着在5分钟内写出你自己的作品。事实上,我画了一幅很脏的素描:

static class LFUList<T> extends AbstractCollection<T> {

    private final int size;

    private ArrayDeque<T> deque;

    public LFUList(int size) {
        super();
        this.size = size;
        deque = new ArrayDeque<>(size);
    }

    @Override
    public Iterator<T> iterator() {
        return deque.iterator();
    }

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

    @Override
    public boolean add(T e) {
        if (deque.size() == size) {
            deque.pollFirst();
        }
        return deque.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return deque.remove(o);
    }

}
静态类LFUList扩展了AbstractCollection{
私人最终整数大小;
私人住宅;
公共列表(整数大小){
超级();
这个。大小=大小;
deque=新的阵列QUE(尺寸);
}
@凌驾
公共迭代器迭代器(){
返回deque.iterator();
}
@凌驾
公共整数大小(){
返回deque.size();
}
@凌驾
公共布尔加法(TE){
if(deque.size()=大小){
德克·波尔菲斯特();
}
返回数据。添加(e);
}
@凌驾
公共布尔删除(对象o){
回位。移除(o);
}
}

任何列表都可以。只需将其包装到您自己的类中,以确保该不变量得到尊重。我遗漏了什么吗?是什么让你的问题与你自己的问题不同?我想知道java 8或9是否提供了这样一个有限大小的列表。Apache commons提供了java不提供这样一个开箱即用的有限大小列表吗?@nimo23我不知道有这样一个内置功能,不可以。我强烈建议使用
ArrayDeque
而不是
ArrayList
,因为前者允许从一开始就删除,其效率与从末尾删除相同。相反,
ArrayList
在删除第一个元素时必须复制整个数组。@霍尔格过了很长时间,我需要这个并更新了:)@Eugene你是我的英雄!