ArrayList 有啥问题?
Posted
技术标签:
【中文标题】ArrayList 有啥问题?【英文标题】:What's Wrong with an ArrayList?ArrayList 有什么问题? 【发布时间】:2011-03-20 14:07:43 【问题描述】:最近我问了一个关于 SO 的问题,其中提到了可能使用 c# ArrayList 作为解决方案。有人评论说使用数组列表是不好的。我想更多地了解这一点。我以前从未听说过关于数组列表的这种说法。 有人可以让我快速了解使用 arraylists 可能出现的性能问题
c#。 .net-2
【问题讨论】:
忽略任何性能问题,我想不出自 2.0 以来您更喜欢 ArrayList 而不是通用的情况。 即使需要对象列表,也可以使用 List @DOK - .Net 2.0 中引入了泛型 @DOK:泛型是在 2.0 中添加的,我没有关注您的评论,请解释一下? 【参考方案1】:ArrayList 的主要问题是它使用了object
——这意味着你必须对你封装的任何东西进行转换。它是泛型之前的遗留物,可能只是为了向后兼容。
ArrayList 没有泛型列表所具有的类型安全性。性能问题在于需要将对象转换回原始对象(或发生隐式装箱)。
每当您使用值类型时,都会发生隐式装箱 - 将其放入 ArrayList 时将被装箱,而在引用时将被取消装箱。
问题不仅在于性能,还在于可读性和正确性。自从泛型出现以来,这个对象已经过时了,只需要在 .NET 1.0/1.1 代码中。
【讨论】:
@Russ Cam - 感谢您的评论。在您发表评论时更新了答案;)【参考方案2】:如果您要存储值类型(int、float、double 等 - 或任何结构),ArrayList 将导致对每个存储进行装箱并在每个元素访问时取消装箱。这可能会对性能造成重大影响。
此外,ArrayList 完全缺乏类型安全性。由于所有内容都存储为“对象”,因此作为开发人员,您有额外的负担来保证它的安全。
另外,如果你想要存储对象的行为,你总是可以使用List<object>
。与 ArrayList 相比,它没有任何缺点,它有一个很大的 (IMO) 优势:它使您的意图(存储无类型对象)从一开始就明确。
ArrayList
确实只存在,并且应该只用于 .NET 1.1 代码。确实没有理由在 .NET 2+ 中使用它。
【讨论】:
【参考方案3】:ArrayList 不是泛型类型,因此它必须将您放入其中的所有项目存储为对象。这很糟糕,有两个原因。首先,在将值类型放入 ArrayList 时,您会强制编译器将值类型装箱为引用类型,这可能会很昂贵。其次,您现在必须转换从数组列表中拉出的所有内容。这很糟糕,因为您现在需要确保知道里面有什么对象。
List 避免了这些问题,因为它是用正确的类型构造的。 例如:
List<int> ints = new List<int>();
ints.Add(5); //no boxing
int num = ints[0]; // no casting
【讨论】:
【参考方案4】:首选泛型 List<T>
,因为它是泛型的,它提供了额外的类型信息,并且无需对添加到其中的值类型进行装箱/拆箱。
【讨论】:
@DOK -List<T>
存在于 .net 2.0 中
是否有任何与 vb.net Collection 类型等效的泛型,它允许迭代器删除当前项目(假设项目的内容包含标识密钥的信息)?字典将是一个很好的匹配,除了最后一点。【参考方案5】:
除了性能问题之外,还有将错误从运行时转移到编译时的问题。从ArrayList
s 检索到的转换对象必须在运行时发生,并且任何类型错误都会在执行期间发生。使用泛型 List<>
在编译期间检查所有类型。
【讨论】:
使用 List所有装箱和拆箱都可能既昂贵又脆弱。 Microsoft 在 .NET 2.0 泛型的类型和性能方面做了一些不错的改进。
这里有一些不错的读物:
值类型的装箱和拆箱:您需要知道什么?http://www.c-sharpcorner.com/uploadfile/stuart_fujitani/boxnunbox11192005055746am/boxnunbox.aspx
性能:ArrayList vs Listhttp://allantech.blogspot.com/2007/03/performance-arraylist-vs-list.html
【讨论】:
以上是关于ArrayList 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
java中ArrayList和LinkedList有啥区别,分别怎么使用呢
Hadoop 的 Lists.newArrayList和正常的 new ArrayList()有啥区别?