java - 我应该使用哪种 Java 集合类型?

标签 java collections

我正在尝试用 Java 创建一个“有限列表”。如果我添加新条目,它应该删除旧条目。

例如如果列表大小为 3,并且我添加了第 4 个项目,它应该删除第一个项目。目前我在 ArrayList 中使用 remove(0) 解决了这个问题,但我听说 ArrayList 非常慢。

有没有更快的方法来解决这个问题?我当前的代码是:

public class LimitedList<T> extends ArrayList<T> {
    private int maximum;

    public LimitedList(int maximum) {
        this.maximum = maximum;
    }

    @Override
    public boolean add(T t) {
        boolean r = super.add(t);
        while (size() > maximum) {
            remove(0);
        }
        return r;
    }

}

最佳答案

but I heard ArrayList's are very slow.

某些操作对于 ArrayList 很慢s others 用于其他 Collection 。这是因为 ArrayList在窗帘后面使用一个数组,对于头部的删除操作,它必须将所有元素向左移动一个。因此,就大哦而言,对于 ArrayList,从头部移除是 O(n) LinkedListO(1)

如果你只想在集合的尾部添加项目并删除头部的元素,我建议你使用 LinkedList :

public class LimitedList<T> extends LinkedList<T> {

    private int maximum;

    public LimitedList(int maximum) {
        this.maximum = maximum;
    }

    @Override
    public boolean add(T t) {
        boolean r = super.add(t);
        int n = this.size();
        while (n > maximum) {
            this.removeFirst();
            n--;
        }
        return r;
    }

}

来自 @JBNizet 的重要说明是你应该继承自 ArrayListLinkedList直接,但实现一个 Collection<T> ,类似于:

public class LimitedList<T> implements Collection<T> {

    private final LinkedList<T> list;
    private int maximum;

    public LimitedList(int maximum) {
        this.list = new LinkedList<T>();
        this.maximum = maximum;
    }

    @Override
    public boolean add(T t) {
        boolean r = this.list.add(t);
        int n = this.list.size();
        while (n > maximum) {
            this.list.removeFirst();
            n--;
        }
        return r;
    }

    //implement other Collection methods...

}

关于java - 我应该使用哪种 Java 集合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896847/

相关文章:

java - 静态对象和实例对象的 containsAll 比较失败

java - 在 Java J2ME 中使用 RecordStore

Java 的比较器契约

sql - Oracle SQL 中多重集映射的意外结果

collections - VecDeque 环形缓冲区在内部是如何工作的?

swift - iOS Swift 获取惰性 map 集合值

java - Jboss 4.05 中本地 xsd 文件放置在哪里

java - Android 通知标志需要管道吗?

java - java如何创建json格式

java - 逐列向 JTable 添加数据