在我看来,List
基本上是使用LinkedList
实现的,而普通的Array
是作为连续的块实现的。我总是使用List
,因为它位于Generic
命名空间中,因为我认为它使用了动态内存分配 - 但我错了。
昨天我看到了List
使用Reflector的实现,发现它实际上是一个T(T[]
)数组。在操纵Array.Copy
中的每个元素时,周围有很多List
。例如,当您使用Insert
时,它将创建一个新内存并复制插入元素之前/之后的所有元素。所以在我看来List
的使用是非常昂贵的。
我也看到了SortedList
。我不确定为什么SortedList
也在其中实现了一个数组。您是否认为SortedList
使用数组会很糟糕,因为每次对List
进行微操作时都需要对列表进行排序?
我也想知道为什么List
如此受欢迎,因为大多数人使用它而不是去LinkedList
。是否只是因为索引器的灵活性?
答案 0 :(得分:14)
是的,SortedList对于插入是O(n)。小心使用。
最大的原因是现代计算机设计。 CPU缓存非常很重要,因为RAM太慢了。内存总线设计无法跟上CPU时钟速度的快速提升。使高频数字信号传输超过一英寸是非常困难的。
数组具有无与伦比的缓存性能,当您迭代它时,下一个元素很可能已经在缓存中。链接列表给出非常小的几率,这是下一个项目基本上是随机地址。这是昂贵的,它会使处理器停滞不前,等待RAM赶上来。可以是几百个周期。
答案 1 :(得分:2)
因为大多数集合通常不需要插入中间。但他们确实需要通过索引器直接访问。
答案 2 :(得分:2)
如果你想要一个单一类型的内存中集合:
然后List<T>
可能是您的最佳选择。当(2)和(3)不适用时,LinkedList<T>
可能是更好的选择。
答案 3 :(得分:1)
在现实生活中 List 经常不会调用 Array.Copy ,通常只是将项目附加到数组,而不是插入。与链接列表相比,它是 List 的目的。你应该选择一个合适的集合类。
如果您经常使用链接列表插入项目。如果您主要添加项目并需要有效地迭代它们,请使用列表。