数组与数组列表的显着差异? [复制]

Posted

技术标签:

【中文标题】数组与数组列表的显着差异? [复制]【英文标题】:Significant differences in Array vs Array List? [duplicate] 【发布时间】:2012-05-31 14:54:26 【问题描述】:

可能重复:When to use ArrayList over array[] in c#?

从内存或处理器成本的角度来看,数组和 arrayList 对象之间是否存在显着差异?

【问题讨论】:

@NikhilAgrawal 不是该主题的重复,因为该问题专门针对性能差异,而不是使用上下文。 我怀疑 ArrayList 会更慢,因为你必须在检索时强制转换数组中的每个元素。 【参考方案1】:

数组是一种底层数据结构,本质上映射到内存中的一个区域。 ArrayList 是一个可变长度列表,实现为 object 的数组,随着列表的增长会重新分配。

ArrayList 因此有一些与管理内部数组大小相关的开销,以及在访问列表时将对象转换为正确类型的更多开销。

此外,将所有内容存储为 object 意味着值类型在写入时被装箱,在读取时被拆箱,这对性能极为不利。使用List<T>,一个类似但强类型的可变大小列表避免了这个问题。

事实上,ArrayList 自 .NET 2.0 以来实际上已被弃用,取而代之的是 List<T>

【讨论】:

还有一个对象叫做简单列表。它与 ArrayList 相比如何。这似乎是一个更复杂的控件。 @MikeOlson 我已经在我的回答中解释了......你读了吗? 抱歉,我读过它,但不确定 List 是否与简单列表相同。那么基本上这个简单的列表已经基本取代了Array列表,有利于易用性? @MikeOlson Yes List 替换了 ArrayList,因为它是强类型的,避免了必须转换为对象并返回的不便、潜在错误和性能问题。 谢谢,这是有道理的。感谢您抽出宝贵的时间来回答。【参考方案2】:

数组是固定大小的连续内存块,而 ArrayList(尽管您应该更喜欢 List,因为 .NET 2.0)包装一个数组以提供可动态调整大小的存储。

它们之间的“区别”在于,就它们的封装而言,ArrayList 是可调整大小的,而数组则不是。就实现而言:因为 ArrayList 包装(并重新分配)数组,所以它比数组需要更多的内存(因为它必须知道当前元素的数量,而不是它的容量),此外 ArrayList 也如果达到其内部容量,则需要 CPU 时间来重新分配和复制其内部数组。

然而,实例化一个 ArrayList 并不比分配一个数组更昂贵。唯一的区别是初始化 ArrayList 的状态所需的少量指令。差异可以忽略不计,不值得担心。

您会发现,如果您自己重新分配数组作为创建可调整大小的集合的方法,那么最好使用 ArrayList/List,因为它已经过全面测试。

【讨论】:

还有一个对象叫做简单列表。它与 ArrayList 相比如何。这似乎是一个更复杂的控件。 ArrayList 和 Generic List 的主要区别在于,generic list 是类型安全的,而 arraylist 不是。

以上是关于数组与数组列表的显着差异? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何测试测量值之间的显着差异?

gcc中的数组与指针自动矢量化

日期之间的差异np数组 - 当前日期

如何使数组过滤器与异步函数端一起使用? [复制]

为啥在 c# 中重用数组会显着提高性能?

在 Python 中,如何计算两个数据数组之间的相关性和统计显着性?