1

有这个奇怪的代码AbstractCollection

public Object[] toArray() {
    // Estimate size of array; be prepared to see more or fewer elements
    Object[] r = new Object[size()];
    Iterator<E> it = iterator();
    for (int i = 0; i < r.length; i++) {
        if (! it.hasNext()) // fewer elements than expected
            return Arrays.copyOf(r, i);
        r[i] = it.next();
    }
    return it.hasNext() ? finishToArray(r, it) : r;
}

“准备好看到更多或更少的元素”部分是恕我直言,纯粹是胡说八道:

  • 如果集合同时发生变化,迭代器ConcurrentModification无论如何都会抛出异常。
  • 我还没有找到任何支持这个的非并发子类,尤其是
    • 在调整大小的情况下,可以(由于可见性问题)复制一堆s 而不是数据的ArrayList用途,Arrays.copyOf(elementData, size)null
    • 如果你足够幸运的LinkedList话。ArrayIndexOutOfBoundsException

我忽略了什么吗?

您会在您的收藏中支持此功能(用于一般用途)吗?

4

1 回答 1

2

来自toArray()的 JAVA DOC

此实现返回一个数组,其中包含此集合的迭代器返回的所有元素,以相同的顺序存储在数组的连续元素中,从索引 0 开始。返回数组的长度等于迭代器返回的元素数,即使此集合的大小在迭代期间发生变化,如果集合允许在迭代期间进行并发修改,可能会发生这种情况。 size 方法仅作为优化提示调用;即使迭代器返回不同数量的元素,也会返回正确的结果

于 2013-10-18T10:53:23.143 回答