簡體   English   中英

ArrayList add()的行為

[英]How the ArrayList add() behaves

考慮以下兩個代碼段:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
for (int i=1; i<10; i++)
    list.add(i);

ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=1; i<10; i++)
    list.add(i);
list.add(0,0);

我真的很想知道這兩種情況下是否存在性能差異? 我在想的是ArrayList實際上是一個Object [] ...所以第二個代碼段將需要將原始數組復制到某個地方,然后在位置0處創建一個新的'0'...所以我認為第一種方法確實更好嗎?

...因此第二個代碼段將需要將原始數組復制到某個位置,然后在位置0處創建一個新的'0'數組...

如果它在當前空間中有足夠的空間,則不必分配一個空間(通過該代碼,它將使用Oracle的實現-just ,默認初始容量為10)。 但這確實需要洗牌。

...所以我認為第一種方法確實更好?

絕對是,並且出於您的原因。 第二個塊只是不必要地使ArrayList在基礎數組中移動東西。

(這並不是很重要,除非它處於一個非常緊密的循環中,要運行數百萬次……但仍然如此。)

第一種選擇更好。 通常,順序訪問速度更快,但第一個示例也更清晰,恕我直言。

如果您確實想知道,可以檢查源。

list.add(0, 0);

將元素沿底層數組重新排列。 它僅在沒有足夠的容量list.add(i)list.add(i)必須這樣做list.add(i)下創建一個新數組。

第二種方法將轉移Arraylist中的其他元素,從而引入性能問題。 請參閱此文檔鏈接 僅當沒有空間時,它才會創建新的陣列。

第一種方法只是更好的實踐,但是在這種情況下,兩者都沒有明顯的優勢。 盡管有其他答案,但是ArrayLists不需要花時間插入一個元素,無論它在哪里。 也就是說,在開始處插入0是恆定的。 請注意,如果要插入多個元素,則時間為O(n),其中n是要插入的項數。

當我對這兩個代碼片段都進行了一些測試時,結果如下:

794913915
703911773

838856889
942264566

因此您可以看到,當您插入一個元素時,這並不重要。 注:本次測試插入100項,而不是10 ,但對於結果10是相同的。 但是,如果我們運行相同的測試,除了第一個案例首先插入100項目,第二個案例之后在列表的開頭插入100項目,則結果如下:

1316759001
8390794221

“更好的實踐”方法花費的時間要少得多。

暫無
暫無

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

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