2013-07-21 47 views
0

在Java中,當你這樣做:當一個對象被刪除後,ArrayList的其餘部分會發生什麼?

alist[0].remove(); 

恰好數組列表的其餘部分是什麼。是否所有對象都向上移動,或者它們保持不變,並且[0]處只有一個空索引?

如果不是,有沒有一種有效的方法將每個對象的索引更靠近一個?

爲了澄清我所說的更多effecient意味着:

你可以只取出第一個索引,然後通過ArrayList的迭代並刪除每一個對象,並將其重新分配給新的指數,但這似乎非常ineffecient和它似乎應該有一種方式,但我已經通過JavaDoc page for the ArrayList class翻閱,並沒有看到任何事情會完成我想要做的事情。

+0

你的意思是'aList.remove(0)'? –

回答

1

不理你張貼無關的ArrayList,如果你看看源ArrayList你會發現,在調用ArrayList.remove(obj)當它發現索引(或者如果使用remove(int)它已經知道),那麼做的代碼:

System.arraycopy(elementData, index+1, elementData, index, 
          numMoved); 

ArrayList由數組支持,它將該備份數組中的所有內容都轉移到左側。

在這種情況下,如果您使用remove(int)或O(n)(如果提供一個對象並且刪除操作爲O(n),則查找爲O(1)。

如果您要使用LinkedList,查找是O(n)或O(n),但由於它是一個雙向鏈表,因此移除爲O(1)。

在選擇數據結構時,重要的是要考慮你將如何使用它;根據您的使用模式,總是存在權衡。

5

假設你其實是要問aList.remove(0) ...

由於documented by Oracle

公共電子刪除(INT指數)

刪除指定 位置上的元素在此列表。將任何後續元素向左移動 (從其索引中減去一個)。

因此remove可以根據您的需要。但是,您可能不會考慮實施效率,因爲它需要的時間與列表中剩餘元素的數量成正比。例如,如果您有一個包含100萬個項目的列表,並且您刪除索引0處的項目,則剩餘的999,999個項目將需要移到內存中。

相關問題