为什么SortedList和List使用数组,为什么LinkedList没用多少?

时间:2010-09-13 19:28:49

标签: c# list linked-list sortedlist

在我看来,List基本上是使用LinkedList实现的,而普通的Array是作为连续的块实现的。我总是使用List,因为它位于Generic命名空间中,因为我认为它使用了动态内存分配 - 但我错了。

昨天我看到了List使用Reflector的实现,发现它实际上是一个T(T[])数组。在操纵Array.Copy中的每个元素时,周围有很多List。例如,当您使用Insert时,它将创建一个新内存并复制插入元素之前/之后的所有元素。所以在我看来List的使用是非常昂贵的。

我也看到了SortedList。我不确定为什么SortedList也在其中实现了一个数组。您是否认为SortedList使用数组会很糟糕,因为每次对List进行微操作时都需要对列表进行排序?

我也想知道为什么List如此受欢迎,因为大多数人使用它而不是去LinkedList。是否只是因为索引器的灵活性?

4 个答案:

答案 0 :(得分:14)

是的,SortedList对于插入是O(n)。小心使用。

最大的原因是现代计算机设计。 CPU缓存非常很重要,因为RAM太慢了。内存总线设计无法跟上CPU时钟速度的快速提升。使高频数字信号传输超过一英寸是非常困难的。

数组具有无与伦比的缓存性能,当您迭代它时,下一个元素很可能已经在缓存中。链接列表给出非常小的几率,这是下一个项目基本上是随机地址。这是昂贵的,它会使处理器停滞不前,等待RAM赶上来。可以是几百个周期。

答案 1 :(得分:2)

因为大多数集合通常不需要插入中间。但他们确实需要通过索引器直接访问。

答案 2 :(得分:2)

如果你想要一个单一类型的内存中集合:

  1. 该系列必须可以成长。
  2. 最常见的变异操作是将项目追加到集合的末尾。
  3. 索引的快速检索至关重要。
  4. 然后List<T>可能是您的最佳选择。当(2)和(3)不适用时,LinkedList<T>可能是更好的选择。

答案 3 :(得分:1)

在现实生活中 List 经常不会调用 Array.Copy ,通常只是将项目附加到数组,而不是插入。与链接列表相比,它是 List 的目的。你应该选择一个合适的集合类。

如果您经常使用链接列表插入项目。如果您主要添加项目并需要有效地迭代它们,请使用列表