【问题标题】:Why do SortedList and List use array and why is LinkedList not much used?为什么 SortedList 和 List 都使用数组,为什么 LinkedList 用的不多?
【发布时间】:2011-04-11 20:20:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 仔细观察:List not 创建一个新数组并在 each 调用时复制所有项目。数组只有在满时才会调整大小,并且会调整为原始大小的两倍。当不断添加项目时,调整大小只会以指数增加的间隔发生。
  • 这个问题没有正确答案。考虑更具体或标记为 wiki
  • @dtb 是的,它使用 this._items[this._size++] = item;是的,它以指数方式增加间隔,但它如何始终确保 size++ 确实有一个空白空间?

标签: c# list linked-list sortedlist


【解决方案1】:

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

【讨论】:

  • 成功了 :) 最好的理由。此外,List<T> 更易于使用和理解。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    是的,SortedList 对于插入来说是 O(n)。谨慎使用。

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

    数组具有无与伦比的缓存性能,当你迭代它时,下一个元素很可能已经在缓存中。链表给出了这种情况的可能性很小,下一项基本上位于随机地址。这很昂贵,它会使处理器停顿,等待 RAM 赶上来。可以是数百个周期。

    【讨论】:

    • 是的,SortedList 在我看来真的很贵。我想我从你那里得到了答案。所以重点是:Array => Good,因为下一个元素可以立即使用,从而减少 CPU 的工作量。 LinkedList => 在中间插入时很好,我也不经常需要。 SortedList => 非常昂贵,应该避免。
    • +1 非常好的观点/解释。并且不要忘记,如果您在需要下一个时必须访问上一个元素地址,那么您会更慢:)
    • @abhishek:SortedList 有不同的用途。它是一个关联集合(键值),它按键排序,并且具有非常快的 O(log n ) 键查找。
    【解决方案4】:

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

    1. 集合必须是可增长的。
    2. 最常见的变异操作是将一个项目追加到集合的末尾。
    3. index 的快速检索至关重要。

    那么List<T>可能是您的最佳选择。当 (2) 和 (3) 不适用时,LinkedList<T> 可能是更好的选择。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2011-08-24
      • 2010-09-15
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多