我经常使用ArrayList而不是'普通'array[]

当我使用<=>时,我觉得好像在欺骗(或者懒惰),什么时候可以在阵列上使用<=>?

有帮助吗?

解决方案

数组是强类型的,并且可以作为参数使用。如果您知道集合的长度并且已修复,则应使用数组。

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

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

其他提示

除了鲍勃和弗雷德里克的回应之外,我想指出的是,虽然数组有协方差,但通用列表却没有。例如,MyChildClass[]类型的数组可以轻松地转换为MyParentClass[],而List<MyChildClass>不能转换为List<MyParentClass>,至少不能直接转换为<=>。

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

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

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

除非这部分代码对性能至关重要,否则使用ArrayList非常好。

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

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

使用更高的集合抽象有许多优点。您可以添加装饰器以使List只读,使其固定大小,检查进入或离开集合的项目或使用视图(请参阅C#中的GetRange和Java中的subList。)

顺便说一句,ArrayList应始终基于原始数组,否则名称错误。这些操作通常按照您在使用基本数组时的预期实现。如果使用链接列表,通常将其命名为 - LinkedList。这也是使用界面的一个优点:您可以稍后改变您对使用过的实现的想法。

有一些东西使收藏品使用笨重。需要注意的是,集合通常基于对象,并且语言在原始类型和对象类型之间存在相当大的差距。有限的泛型也没有多大帮助。不过,除非有充分的理由,否则我建议使用数组。

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

编码中的精彩冒险写了一篇数组被认为有些危害。这是一个非常有趣的阅读。

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

只有我认为您甚至可能会想到使用ArrayList而不是List。

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

如果您需要一个基本类型数组,请使用Array以获得更好的性能,因为它可以避免自动装箱和取消装箱。但前提是你要提前知道你想要的尺寸。

就像这样。

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(); 
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top