【发布时间】:2012-05-31 14:54:26
【问题描述】:
【问题讨论】:
-
@NikhilAgrawal 不是该主题的重复,因为该问题专门针对性能差异,而不是使用上下文。
-
我怀疑 ArrayList 会更慢,因为你必须在检索时强制转换数组中的每个元素。
【问题讨论】:
数组是一种底层数据结构,本质上映射到内存中的一个区域。 ArrayList 是一个可变长度列表,实现为 object 的数组,随着列表的增长会重新分配。
ArrayList 因此有一些与管理内部数组大小相关的开销,以及在访问列表时将对象转换为正确类型的更多开销。
此外,将所有内容存储为 object 意味着值类型在写入时被装箱,在读取时被拆箱,这对性能极为不利。使用List<T>,一个类似但强类型的可变大小列表避免了这个问题。
事实上,ArrayList 自 .NET 2.0 以来实际上已被弃用,取而代之的是 List<T>。
【讨论】:
数组是固定大小的连续内存块,而 ArrayList(尽管您应该更喜欢 List,因为 .NET 2.0)包装一个数组以提供可动态调整大小的存储。
它们之间的“区别”在于,就它们的封装而言,ArrayList 是可调整大小的,而数组则不是。就实现而言:因为 ArrayList 包装(并重新分配)数组,所以它比数组需要更多的内存(因为它必须知道当前元素的数量,而不是它的容量),此外 ArrayList 也如果达到其内部容量,则需要 CPU 时间来重新分配和复制其内部数组。
然而,实例化一个 ArrayList 并不比分配一个数组更昂贵。唯一的区别是初始化 ArrayList 的状态所需的少量指令。差异可以忽略不计,不值得担心。
您会发现,如果您自己重新分配数组作为创建可调整大小的集合的方法,那么最好使用 ArrayList/List,因为它已经过全面测试。
【讨论】: