集合中的“差距”是什么?

时间:2019-01-24 17:32:10

标签: c# collections

我有MeasureUp 70-483 C#练习测试。一个问题非常令人困惑:

您使用Microsoft .NET Framework 4.5创建应用程序。您的应用程序必须按特定顺序存储人员集合。如果从集合中删除一个人,则集合会自动调整自身大小以不留任何空隙。同样,从集合中访问某个人一定不能将该人从集合中删除。您需要选择一个收集类。 您应该使用哪个班级?

LinkedList |队列|堆叠ArrayList

根据MeasureUp的答案是LinkedList。从ArrayList中删除项目时,它也会自动调整大小。我通过Count属性对其进行了检查。为什么MeasureUp选择LinkedList而不是ArrayList?

3 个答案:

答案 0 :(得分:1)

Count是列表中有多少个项目,不一定实际分配了多少个项目。

话虽这么说,但我不认为有任何事情可以阻止LinkedList为额外(或先前删除)的项目“保留”空间。

答案 1 :(得分:1)

  

如果从集合中删除一个人,则集合自动调整大小,不会留有任何空白。

我的解释(事后看来)是,LinkedList抽象数据类型会在删除项目后自动调整大小,而ArrayList是基于通过移动元素来手动调整底层数组的大小(产生性能罚款)

不用说,工作是BCL数据类型的内部功能,从框架用户的角度来看,没有“差距”,并且它们在性能和某些其他此类特征方面有所不同。

我确信这门语言会更好。有趣的是,如果您忽略问题的实质,而只关注所使用的语言,那么所有提到的BCL数据类型都适合该问题。

答案 2 :(得分:1)

ArrayList是一种古老的收藏类型(始于通用v1.x的时间范围)。它本质上是一个类似于列表的数组。如果从中间删除某些内容,它将“留下”阵列中的间隙,我相信,通过将阵列中的每个元素向下移动一个单元格可以填补该间隙。正如@DavidG所指出的,没有人再使用这种类型。他们改用List<T>

LinkedList是一个链表。列表中的第一个节点指向(即链接到)下一个节点,第二个指向第三个节点,依此类推。如果在两个其他节点( a b )之间插入一个节点( c ),则节点 a 为调整为指向 c ,然后将c设置为指向 b 。如果要删除节点(例如,从诸如 x y z 之类的列表中删除节点 y ),然后将 x 调整为指向 z ,然后 y 有效消失(没有引用,它就有资格进行垃圾回收)。

数组列表中的项目很容易通过索引进行寻址(它们毕竟是数组的掩护)。如果要访问“链接”列表中的第100个项目,则需要从第一个节点开始,跟随所有指向所有其他节点的指针,直到到达第100个项目为止。如果随后要求第99位,则遍历该列表将重新开始。