我正在尝试评估使用现有集合创建ArrayDeque的两个..我看到两个选项:
从我的基准测试中,我看到第一个选项运行速度比第二个快。第一种选择是否优于第二种选择?
答案 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并将每个元素添加一个类似。因为在这个类的构造函数中使用迭代遍历所有集合。