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

Flo*_*ian 1 java collections

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

例如,如果列表大小为3,并且我添加了第4项,则应删除第1项.目前我用remove(0)a 解决了这个问题ArrayList,但我听说ArrayLists很慢.

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

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

但我听说ArrayList非常慢.

ArrayList其他集合的某些操作对其他操作来说很慢.这是因为ArrayList在窗帘后面使用了一个阵列,并且对于头部的移除操作,它必须将所有元素向左移动一个.因此,在大的方面哦,从头部移除是O(N)ArrayListS其中它是O(1)LinkedList秒.

如果您只想在集合的尾部添加项目并删除头部中的元素,我建议您使用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;
    }

}
Run Code Online (Sandbox Code Playgroud)

@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...

}
Run Code Online (Sandbox Code Playgroud)

  • [`ArrayDeque`](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayDeque.html)可能比[`LinkedList`](HTTPS一个更好的选择://文档. oracle.com/javase/7/docs/api/java/util/LinkedList.html):*[`ArrayDeque`]可能是[...]比`作为队列使用时LinkedList`更快*. (3认同)
  • 他不应该首先扩展LinkedList.LimitedList不是List. (2认同)