我经常使用ArrayList
代替'普通'array[]
。
当我使用ArrayList
时,我觉得好像在欺骗(或者懒惰),什么时候可以在数组上使用ArrayList
?
答案 0 :(得分:60)
数组是强类型的,并且可以作为参数使用。如果您知道集合的长度并且已修复,则应使用数组。
ArrayLists不是强类型的,每次Insertion或Retrial都需要强制转换才能恢复原始类型。如果您需要一个方法来获取特定类型的列表,ArrayLists就会失败,因为您可以传入包含任何类型的ArrayList。 ArrayLists在内部使用动态扩展数组,因此当内部数组达到其容量时,也会有一个扩展来扩展内部数组的大小。
您真正想要使用的是List<T>
之类的通用列表。这具有Array和ArrayLists的所有优点。它是强类型的,它支持可变长度的项目。
答案 1 :(得分:14)
除了鲍勃和弗雷德里克的回应之外,我想指出的是,虽然数组有协方差,但通用列表却没有。例如,MyChildClass[]
类型的数组可以轻松地投放到MyParentClass[]
,而List<MyChildClass>
无法投放到List<MyParentClass>
,至少不能直接投放到{{1}}。
如果您需要协方差,请使用数组,使用LINQ的Cast()方法或其他方法单独转换每个项或等待C#4 。
答案 2 :(得分:7)
另一个想法是变异;数组(T[]
)完全可变,无法保护。 List<T>
没有提供任何有用的扩展点,但Collection<T>
(或许多其他IList<T>
实现)之类的内容允许您添加代码,例如,在添加项目之前检查项目;同样,您可以拥有只读IList<T>
实现,这对于需要不变性的线程安全非常有用。
我倾向于在内部方法逻辑中使用数组(可能作为局部变量),作为params
参数,或者在一些高度优化的情况下使用数据,我知道项目的长度,我知道代码选择不要改变它(作为私有字段)。除此之外,List<T>
等往往更常见,因为它们在添加/删除项目时的开销要小得多。
答案 3 :(得分:5)
除非这部分代码对性能至关重要,否则使用ArrayList非常好。
答案 4 :(得分:4)
更好的是,无论您在何处使用ArrayList
,请使用List<T>
通用集合。它的输入类型比前者更强。
答案 5 :(得分:1)
我是从Java角度回答这个问题,但这是基本相同的问题。你不应该使用更高的抽象感到内疚。毕竟,您使用的是String
而不是char[]
,甚至是byte[]
?我甚至建议更进一步,尽可能使用List
接口。一步到位的唯一原因是出于性能原因。
使用更高的集合抽象有许多优点。您可以添加装饰器以使List成为只读,使其成为固定大小,检查进入或离开集合的项目或使用视图(请参阅C#中的GetRange
和Java中的subList
。“
顺便说一下,ArrayList
应始终基于原始数组,否则名称错误。这些操作通常按照您在使用基本数组时的预期实现。如果使用链接列表,通常将其命名为 - LinkedList
。这也是使用界面的一个优点:您可以稍后改变您对使用过的实现的想法。
有一些东西使收藏品使用笨重。需要注意的是,集合通常基于对象,并且语言在原始类型和对象类型之间存在相当大的差距。有限的泛型也没有多大帮助。不过,除非有充分的理由,否则我建议使用数组。
对于原始值,您还可以考虑使用原始集合库,例如GNU Trove。不过,不知道C#是否有类似的东西。
答案 6 :(得分:1)
Fabulous Adventures In Coding撰写了一篇文章Arrays considered somewhat harmful。这是一个非常有趣的阅读。
答案 7 :(得分:0)
对于一个,如果您只打算处理特定类型,则不应使用ArrayList。例如,如果您只需要一个字节数组,那么您应该只接受一个字节数组。
只有我认为您甚至可能会想到使用ArrayList而不是List。
答案 8 :(得分:0)
数组的大小是静态的,因此如果您在设计时知道大小,请使用数组。它应该更快,但我没有自己测试。如果您需要经常更改对象的数量(在集合中添加或删除对象),请使用ArrayList或更好的.NET 2中的通用List。它也更易于使用,因此如果性能不是至关重要,您可以始终使用List。
答案 9 :(得分:0)
如果您需要一个基本类型数组,请使用Array以获得更好的性能,因为它可以避免自动装箱和取消装箱。但前提是你要提前知道你想要的尺寸。
答案 10 :(得分:0)
就像这样。
using System;
using System.Collections;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//ArrayList
/*
An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects
*/
ArrayList list = new ArrayList();
list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
list.Add(1);
list.Add(1.25);
//Array
/*
must declare length.
*/
string[] array = new string[3]; // you must declare object types
array[0] = "1";
//array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
array[2] = "stongly typed";
Console.WriteLine("------- ARRAYLIST ITEMS ---------");
foreach (var i in list) {
Console.WriteLine(i);
}
Console.WriteLine("--------- ARRAY ITEMS -----------");
foreach (var i in array)
{
Console.WriteLine(i);
}
Console.ReadKey();
}
}
}