现有Collection vs Iteration

时间:2017-12-05 18:47:30

标签: java data-structures collections java-api

我正在尝试评估使用现有集合创建ArrayDeque的两个..我看到两个选项:

  1. 使用接受现有收藏的ArrayDeque' constructor
  2. 迭代Collection并在迭代Collection
  3. 时调用dequeu.offer(element)

    从我的基准测试中,我看到第一个选项运行速度比第二个快。第一种选择是否优于第二种选择?

2 个答案:

答案 0 :(得分:4)

关于第一个选项。

public ArrayDeque(Collection<? extends E> c) {
    allocateElements(c.size());
    addAll(c);
}

它在一次调用中分配所有元素(也就是说,它分配一个具有足够元素的数组),然后逐个添加它们(不需要任何额外的分配)。

但是当你使用选项2时,在ArrayDeque增长(自身加倍)的过程中会发生几次分配;加上每次重新分配时,元素都会复制到新数组中。

只有一个分配(对于选项1)与几个分配加上复制(对于选项2)给出了差异。

供参考:

public boolean offerLast(E e) {
    addLast(e);
    return true;
}

public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}

所有代码均来自Java 8。

答案 1 :(得分:0)

使用构造函数创建新的ArrayDeque并以迭代方式迭代Collection并将每个元素添加一个类似。因为在这个类的构造函数中使用迭代遍历所有集合。