为什么删除元素后需要将ArrayList的元素向左移动?

时间:2018-07-27 11:20:51

标签: java list loops arraylist null

据我所知,以下是删除ArrayList中的元素的步骤。

  1. 无需对目标元素进行任何操作
  2. 在数组中从删除的元素之后的1迭代到最后一个元素
  3. 将每个元素复制到位置1之前
  4. 将最后一个元素设置为null

为什么不只是将我们要删除的元素设置为null?只需一步。

有人可以解释上述方案的优点吗?预先感谢。

4 个答案:

答案 0 :(得分:4)

因为它们不相同(我们删除"c"):

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

删除和替换之间有很大的区别:

  • 删除操作会更改索引,删除元素并移动(影响)其余元素。这也会更改列表的大小。例如元素"d"可从索引2访问(从3移动)。
  • 替换将替换项目并保持元素索引,并且列表大小也保持不变。例如元素"d"可从索引4访问(不变)。

答案 1 :(得分:1)

...因为这就是列表的工作方式。许多用例需要这种动态调整大小的行为,因此Java has an interface for the List conceptArrayList是List的几种实现之一,LinkedList是List的另一种实现。

我们已经有了您要描述的行为,the Array-因此,在需要该行为的地方,可以使用{{1}}。

答案 2 :(得分:1)

  

为什么不只是将要删除的元素设置为null?

将元素设置为null不会删除它正在替换一个元素。

该方法还有另一个问题,如果列表中的null表示该索引处的元素被“删除”,那么如果我想实际存储null作为元素怎么办?如何区分删除的元素和实际的null元素?

利用List<T> API中的remove方法,不要尝试重新发明轮子,因为它们会尽其所能。

答案 3 :(得分:1)

ArrayLists就像具有不同之处的数组-它们是可调整大小的(在此示例中无关紧要)。
考虑以下数组:[ref1,ref2,ref3,ref4],其中ref1:4是对某些对象的引用。这意味着它们不包含对象本身,它们仅指向对象。现在,如果您要删除ref2,例如,通过将其声明为null来删除它,这意味着它现在不会指向任何对象(ref2 = null),但这并不意味着该引用本身会消失。您的新array(ArrayList)现在为[ref1,null,ref3,ref4]。你看?替换和删除之间有区别。...