ArrayList 与 List<object>

Posted

技术标签:

【中文标题】ArrayList 与 List<object>【英文标题】:ArrayList vs List<object> 【发布时间】:2010-09-28 07:29:17 【问题描述】:

我在Initialize generic object with unknown type看到了 Jon 的回复:

如果你想要一个集合 包含多种不相关的类型 值,但是,您将不得不使用 List&lt;object&gt;

我不是在比较 ArrayListList&lt;&gt;,而是比较 ArrayListList&lt;object&gt;,因为两者都将暴露 object 类型的元素。在这种情况下使用其中任何一个有什么好处?

编辑:这里不关心类型安全,因为这两个类都将object 作为它的项目。仍然需要从object 转换为所需的类型。我对类型安全以外的任何事情都更感兴趣。

编辑:感谢 Marc Gravell 和 Sean 的回答。抱歉,我只能选择 1 作为答案,所以我会同时投票。

【问题讨论】:

【参考方案1】:

您可以直接使用List&lt;object&gt; 使用LINQ 扩展方法,但不能使用ArrayList,除非您注入Cast&lt;object&gt;() / OfType&lt;object&gt;(感谢IEnumerable&lt;object&gt;IEnumerable)。即使您不需要类型安全等,这也很有价值。

速度将大致相同;结构仍然会被装箱,等等 - 所以没有什么可以区分它们的。除了我倾向于将ArrayList 视为“哎呀,有人又在编写遗留代码……”;-p

【讨论】:

【参考方案2】:

使用List&lt;object&gt; 的一大好处是,如今大多数代码都是为使用通用类/接口而编写的。我怀疑现在大多数人会编写一个采用IList&lt;object&gt; 而不是IList 的方法。由于ArrayList 没有实现IList&lt;object&gt;,因此您将无法在这些场景中使用数组列表。

我倾向于将非泛型类/接口视为遗留代码,并尽可能避免使用它们。

【讨论】:

【参考方案3】:

在这种情况下,ArrayListList&lt;Object&gt; 那么您不会注意到速度上有任何差异。每个可用的实际方法可能存在一些差异,特别是在 .NET 3.5 和计数扩展方法中,但这与 ArrayList 在某种程度上被弃用有关。

【讨论】:

【参考方案4】:

是的,除了类型安全之外,泛型集合实际上可能更快。

来自 MSDN (http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx)

System.Collections.Generic 命名空间包含接口和 定义泛型的类 集合,允许用户 创建强类型集合 提供更好的类型安全性和 性能比非泛型强 类型化的集合。

【讨论】:

List&lt;object&gt; 与使用 ArrayList 相比,在类型安全和性能方面并没有给您太多改进@.【参考方案5】:

做一些基准测试,你就会知道什么表现最好。我猜测差异非常小。

【讨论】:

实际上我不确定问题是否与性能有关,但这是一个好点。我的猜测是由于额外的装箱、拆箱,arraylist 的性能会更差。 @Anonymous:还有什么拳击? ArrayListList&lt;object&gt; 应该有相同数量的装箱/拆箱。 “一个包含多个不相关类型值的集合” - 我的理解是,当向 List 集合对象添加不同类型时,会发生装箱/拆箱,而使用 arraylist 则没有。我想我错了。【参考方案6】:

List 是 ArrayList 的类型安全版本。它将保证您将在集合中获得相同的对象类型。

【讨论】:

显然我在这里不是指类型安全

以上是关于ArrayList 与 List<object>的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList 与 List<object>

ArrayList与List<T>笔记

list.clear() 与 list = new ArrayList<Integer>(); [复制]

list 接口与实现类arraylist 区别

JAVA这样的定义:Collection<String>n=new ArrayList<String>()与List<String>n=new ArrayList(

ArrayList <Integer> 与 get/remove 方法