簡體   English   中英

為什么刪除元素后需要將ArrayList的元素向左移動?

[英]Why need to shift elements of ArrayList to the left after removing an element?

據我所知,這是刪除ArrayList中的元素的步驟。

  1. 無需對目標元素做任何事情
  2. 沿着數組從刪除的元素之后的1到最后一個元素進行迭代
  3. 將每個元素復制到位置1之前
  4. 將最后一個元素設置為null

為什么不只是將要刪除的元素設置為null 這僅需一步。

誰能解釋以上方案的優點? 提前致謝。

因為這些不一樣(我們刪除"c" ):

  • ["a", "b", "d", "e"]
  • ["a", "b", null, "d", "e"]

刪除和替換之間有很大的區別:

  • 刪除操作會更改索引,刪除元素並移動(影響)其余元素。 這也會更改列表的大小。 例如 元素"d"可在索引2 (從3移到)處訪問。
  • 替換將替換項目並保持元素索引,並且列表大小也保持不變。 例如 元素"d"可從索引4訪問(未更改)。

...因為這就是列表的工作方式。 許多用例都需要這種動態調整大小的行為,因此Java 具有List概念的接口 ArrayList是List的幾種實現之一, LinkedList是另一個。

我們已經有了您要描述的行為Array ,因此在需要該行為的地方可以使用String[]

為什么不只是將我們要刪除的元素設置為null?

將元素“設置為null”並不意味着刪除元素,而是要替換元素。

這種方法還有另一個問題,如果列表中的null表示“刪除”了該索引處的元素,那么如果我想實際將null存儲為元素怎么辦? 如何區分刪除的元素和實際的null元素?

利用List<T> API中的remove方法,不要嘗試重新發明輪子,因為它們會盡其所能。

ArrayList就像數組一樣,只是有一個不同-它們是可調整大小的(在此示例中這無關緊要)。
考慮以下數組: [ref1,ref2,ref3,ref4] ,其中ref1:4是對某些對象的引用。 這意味着它們不包含對象本身,它們僅指向對象。 現在,如果您想刪除ref2,例如將其聲明為null,則表示它現在不會指向任何對象( ref2 = null ),但這並不意味着該引用本身會消失,您的new array(ArrayList)將是[ref1,null,ref3,ref4]現在。 你看? 更換和拆卸之間是有區別的。

暫無
暫無

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

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