.net 列表如何<;T>;内部映射?

.net 列表如何<;T>;内部映射?,.net,arrays,list,generics,clr,.net,Arrays,List,Generics,Clr,它是在内部被当作数组处理,还是被CLR当作完全不同的类型处理 我正在尝试对列表实现整数值 List<int> lst = new List<int>(); lst.Add(3); lst.Add(4); 数组返回更好的时间跨度结果。那么人们为什么喜欢列表呢。列表是一种数据结构的实现,它负责按需分配内存;它允许在任何索引等处插入和删除。因此,它比简单数组方便得多 在后台,当前的List实现使用一个数组进行存储,执行类似数组的操作时的开销最小。增加的便利通常值很少的性能差异

它是在内部被当作数组处理,还是被CLR当作完全不同的类型处理

我正在尝试对列表实现整数值

List<int> lst = new List<int>();
lst.Add(3);
lst.Add(4);
数组返回更好的时间跨度结果。那么人们为什么喜欢列表呢。

列表是一种数据结构的实现,它负责按需分配内存;它允许在任何索引等处插入和删除。因此,它比简单数组方便得多


在后台,当前的
List
实现使用一个数组进行存储,执行类似数组的操作时的开销最小。增加的便利通常值很少的性能差异(如果相关的话)。添加项的速度通常更快,因为列表分配内存块,并且不需要每次添加时都进行新的分配和复制(与纯数组相比,
长度总是与内存中的大小绑定)。

普通随机访问列表通常有一个内部数组。NET
列表
实现就是这样做的。其他实现,如
LinkedList
使用带有引用的元素链而不是数组。更奇特的列表可能会在内部使用树进行排序


列表
中的内部数组是用短长度(我相信是4)初始化的,如果您试图在数组的最大边界之外添加,它将被扩展。由于这可能会很耗时(需要复制阵列),因此阵列的大小会增加一倍,即当添加第5个元素时,内部阵列的大小会调整为长度8,依此类推。

您可以尝试自己查看。拥有一个动态增长/收缩列表的原因是它不像
Array
is那样是固定大小的。我记得阅读时,
list
数据结构针对速度进行了优化,而
Array
DS针对内存进行了优化。您似乎在反驳
List
针对速度进行了优化这一事实。(当我们说它被重新调整大小和重新分配,当它移出边界时)我不同意这种区别。列表在内部有一个数组,因此本质上与数组存储没有区别。您需要为列表支付一点性能损失,并为此获得一个动态/可调整大小的集合。总之,列表和数组之间最大的区别在于,您始终可以向列表中添加内容。@bugbuster,如果您想向数组中添加项目(以便
Length
增加,也就是说,不只是更改现有项目),您也必须重新分配数组。列表将以更大的块增长,并跟踪数组中已使用元素的数量,因此顺序添加速度更快。因此,您要说的是,尽管可以忽略不计,
列表
提供的响应速度当然比
数组
慢。列表是对数组的抽象,抽象需要额外的CPU周期。Howevrr,我同意Lucero的观点,在正常情况下,List的速度已经足够快了。“响应时间”通常是不相关的,请求在(快速且廉价)边界检查后传递到底层数组。这甚至可能是由运行时内联的,因此它甚至不需要额外的调用。
int[] arr = new int[2];
arr[0] = 3;
arr[1] = 4;