我正在学习 C#,基本上知道数组和 List
之间的区别,后者是通用的并且可以动态增长,但我想知道:
List
元素是像数组一样按顺序位于堆中,还是每个元素“随机”位于不同位置?- 如果这是真的,那会影响从内存中访问和检索数据的速度吗?
- 如果这是真的,这就是数组比
List
快一点的原因吗?
最佳答案
先来看第二个和第三个问题:
and if that true does that affect the speed of access & data retrieval from memory ?
and if that true is this what makes array little faster than list ?
.NET 中只有一种类型的“ native ”集合(对于 .NET,我指的是 CLR,所以是运行时):数组(从技术上讲,如果您将 string
视为一种集合,则是两种 native 类型的集合 :-) )(技术上第 2 部分:并非所有您认为是数组的数组都是“ native ”数组...只有基于 0 的一维数组是“ native ”数组。T[,]
类型的数组不是,第一个元素的索引不是 0 的数组不是)。所有其他集合(LinkedList<>
除外)都建立在它之上。如果您查看 List<T>
与 IlSpy
你会看到在它的底部有一个 T[]
添加了 int
对于 Count
(T[].Length
是 Capacity
)。显然数组比 List<T>
快一点因为要使用它,您就少了一个间接访问(直接访问数组,而不是访问访问列表的数组)。
我们来看第一个问题:
does List elements sequentially located in heap like array or each element is located randomly in different locations?
内部基于数组,显然 List<>
像数组一样记住它的元素,所以在一个连续的内存块中(但要注意 List<SomeObject>
其中 SomeObject
是一个引用类型,该列表是引用的列表,而不是objects,所以引用被放在一个连续的内存块中(我们将忽略计算机的高级内存管理,“连续内存块”这个词并不准确),它应该是最好说“一个连续的地址 block ”))
(是的,即使 Dictionary<>
和 HashSet<>
也是构建在数组之上的。相反,树状集合可以在不使用数组的情况下构建,因为它更类似于 LinkedList
)
一些额外的细节:在 CIL
中有四组指令与“ native ”数组一起使用的语言(在已编译的 .NET 程序中使用的中间语言):
Newarr
Ldelem
和家人Ldelem_*
Stelem
和家人Stelem_*
ReadOnly
(别问我用处,我也不知道,文档也不清楚)
如果你看OpCodes.Newarr
您会在 XML 文档中看到这条评论:
// Summary:
// Pushes an object reference to a new zero-based, one-dimensional array whose
// elements are of a specific type onto the evaluation stack.
关于c# - List<> 元素是否像数组一样按顺序位于堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171131/