38

我经常使用 anArrayList而不是 'normal' array[]

当我使用 an 时,我觉得自己在作弊(或懒惰) ,什么时候可以在数组ArrayList上使用 an ?ArrayList

4

11 回答 11

66

数组是强类型的,可以很好地用作参数。如果您知道集合的长度并且它是固定的,则应该使用数组。

ArrayList 不是强类型的,每次插入或重试都需要强制转换才能恢复到原始类型。如果您需要一种方法来获取特定类型的列表,那么 ArrayLists 就不够用了,因为您可以传入包含任何类型的 ArrayList。ArrayLists 在内部使用动态扩展数组,因此当内部数组达到其容量时,也有一个扩展内部数组大小的问题。

您真正想要使用的是一个通用列表,例如List<T>. 这具有 Array 和 ArrayLists 的所有优点。它是强类型的,它支持可变长度的项目。

于 2009-01-05T11:11:31.973 回答
14

除了 Bob 和 Frederick 的回应,我想指出,虽然数组具有协方差,但泛型列表没有。例如,类型数组MyChildClass[]可以很容易地转换为MyParentClass[],而List<MyChildClass>不能转换为List<MyParentClass>,至少不能直接转换为 。

如果您需要协方差,请使用数组、使用 LINQ 的 Cast() 方法或其他方法来单独转换每个项目或等待 C# 4

于 2009-01-05T11:20:43.780 回答
7

这里的另一个想法是突变。数组 ( T[]) 是完全可变的,不能被保护。List<T>不提供任何有用的扩展点,但是Collection<T>(或许多其他IList<T>实现)之类的东西允许您添加代码,例如,在添加项目之前检查它们;同样,您可以拥有只读IList<T>实现,这对于需要不可变性的线程安全很有用。

我倾向于在内部方法逻辑(可能作为局部变量)中使用数组,作为params参数,或者在一些高度优化的情况下,我知道项目的长度,并且我知道代码选择不改变它(作为私人领域)。除此之外,List<T>等往往更常见,因为在添加/删除项目时它们的开销要少得多。

于 2009-01-05T11:36:06.510 回答
6

除非这部分代码对性能非常关键,否则使用 ArrayList 是非常好的。

于 2009-01-05T11:09:38.623 回答
4

更好的是,无论你在哪里使用ArrayList,都可以使用List<T>泛型集合。它的类型比前者更强。

于 2009-01-05T11:13:53.373 回答
1

我从 Java 的角度回答这个问题,但这是相同的基本问题。你不应该因为使用更高的抽象而感到内疚。毕竟,您使用的是Strings 而不是char[],甚至是byte[]? 我什至建议更进一步,并List尽可能使用该界面。降级的唯一原因是出于性能原因。

使用更高的集合抽象有很多优点。您可以添加装饰器以使列表成为只读,使其大小固定,检查进入或离开集合的项目或使用视图(参见GetRangeC# 和subListJava。)

顺便说一句,anArrayList应该始终基于原始数组,否则名称是错误的。这些操作通常按照您在使用原始数组时所期望的方式实现。如果使用链表,它通常命名为 -- LinkedList。这也是使用接口的一个优势:您可以稍后改变对使用的实现的看法。

有一些事情使集合的使用变得笨拙。需要注意的是,集合通常基于对象,并且语言在原始类型和对象类型之间存在相当大的差距。有限的泛型也没有多大帮助。尽管如此,除非有充分的理由,否则我推荐集合而不是数组。

对于原始值,您还可以考虑使用原始集合库,例如GNU Trove。不过,不知道 C# 是否有类似的东西。

于 2009-01-05T13:08:53.810 回答
1

Fabulous Adventures In Coding写了一篇Arrays 被认为有些有害的文章。这真是一本有趣的书。

于 2009-01-05T13:41:14.590 回答
0

好吧,如果您只打算处理特定类型,则不应使用 ArrayList。例如,如果您只期望一个字节数组,那么您应该只接受一个字节数组。

只有一次我认为您甚至可能会想到使用 ArrayList 来代替 List。

于 2009-01-05T11:15:46.630 回答
0

数组的大小是静态的,所以如果您在设计时知道大小,请使用数组。它应该工作得更快,但我自己没有测试过。如果您需要经常更改对象的数量(从集合中添加或删除对象),请使用 ArrayList 或更好的 .NET 2 中的通用 List。它也更易于使用,因此如果性能不重要,您始终可以使用 List。

于 2009-01-05T11:27:16.403 回答
0

如果您需要原始类型数组,请使用 Array 以获得更好的性能,因为它将避免自动装箱和拆箱。但前提是你提前知道你想要的尺寸。

于 2013-02-05T21:16:22.747 回答
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(); 
        }
    }
}
于 2014-10-28T10:22:43.917 回答