簡體   English   中英

為什么AbstractCollection.toArray()處理大小更改的情況?

[英]Why does AbstractCollection.toArray() handle the case of changed size?

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異常。
  • 我還沒有找到任何非並行子類來支持這一點,特別是
    • ArrayList使用Arrays.copyOf(elementData, size) ,它可以(由於可見性問題)復制一堆null而不是在調整大小的情況下復制數據,
    • 如果足夠幸運, LinkedList會引發ArrayIndexOutOfBoundsException

我在俯視什么嗎?

您會在您的收藏中支持此功能(一般使用)嗎?

toArray()的JAVA DOC

此實現返回一個數組,該數組包含該集合的迭代器返回的所有元素,該數組以相同順序存儲在數組的連續元素中,從索引0開始。返回數組的長度等於迭代器返回的元素數, 即使此集合的大小在迭代過程中發生了變化,也可能發生在集合允許在迭代過程中進行並發修改的情況下。size方法僅作為優化提示進行調用; 即使迭代器返回不同數量的元素,也將返回正確的結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM