Lazy构造的ArrayList具有默认的emptyList以获得更好的性能

时间:2014-04-16 19:46:18

标签: java performance list

如果列表在其生命周期内保持为空,这是否会提高性能?

public class LazyArrayList<E> implements List<E> {

    private List<E> list = Collections.emptyList();

    public add(E e) {
        if (list == Collections.EMPTY_LIST) {
            list = new ArrayList();
        }
        list.add(e);
    }

    // other necessary methods
}

例如:

List<Integer> deleteList = new LazyArrayList<Integer>();
for ( MyObj o : otherList ) {
    if (o.isOutdated()) {
        deleteList.add(o.getId());
    }
}
return deleteList;

2 个答案:

答案 0 :(得分:1)

没有。 ArrayList已经具有此优化(在最新版本的JRE中)。它仅在需要时实例化其内部数组:

/**
 * Shared empty array instance used for empty instances.
 */
private static final Object[] EMPTY_ELEMENTDATA = {};

public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
}

答案 1 :(得分:0)

尝试使用ArrayList.trimToSize()说:

  

将此ArrayList实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。

请查看ArrayList.ensureCapacity()说:

  

如果需要,增加此ArrayList实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。