据我所知,以下是删除ArrayList
中元素的步骤。
- 无需对目标元素执行任何操作
- 沿着数组从删除元素后的1到最后一个元素进行迭代
- 将每个元素复制到其前面的位置1
- 将最后一个元素设置为
null
为什么不将要删除的元素设置为null
?这只需要一步。
有人能解释一下上述方案的优点吗?提前谢谢。
因为它们不一样(让我们删除"c"
(:
["a", "b", "d", "e"]
["a", "b", null, "d", "e"]
拆卸和更换之间有很大区别:
- 移除会更改索引、移除元素并移动(影响(其余索引。这也会更改列表的大小。例如,元素
"d"
可在索引2
(从3
移动(处访问 - 替换将替换项目并保持元素的索引,列表的大小也保持不变。例如,元素
"d"
在索引4
处是可访问的(未改变(
为什么不将我们想要删除的元素设置为null?
将元素"设置"为null不是删除元素,而是替换一个元素。
这种方法还有另一个问题,如果列表中的null
意味着该索引处的元素被"移除",那么如果我想实际将null
存储为元素呢?如何区分移除的元素和实际的null
元素?
利用List<T>
API中的remove
方法,不要试图尽可能地重新发明车轮。
。。。因为列表就是这样工作的。许多用例都需要这种动态大小调整行为,因此Java为List概念提供了一个接口。ArrayList是List的几种实现之一,LinkedList是另一种。
我们已经有了你所描述的行为,数组——所以在你需要这种行为的地方,你可以使用String[]
。
ArrayList就像数组一样,有一个区别——它们可以调整大小(在本例中无关紧要(
考虑以下数组:[ref1,ref2,ref3,ref4]
,其中ref1:4是对某些对象的引用。这意味着它们不包含对象本身,它们只指向对象。现在,如果您想删除ref2,例如通过声明它为null,这意味着它现在不会指向任何对象(ref2 = null
(,但这并不意味着引用本身会消失。您的新数组(ArrayList(现在将为[ref1,null,ref3,ref4]
。你看到了吗?更换和拆卸是有区别的。。。。