[英]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.