zoukankan      html  css  js  c++  java
  • Array和ArrayList的异同点

    Array和ArrayList的异同点2007-04-10 11:22相信数组是大家在编程最常使用的,不论任何语言都存在数组这样的数据结构,由于C#语言是完全面向对象的,所以在C#中的数组也是对象,
    实际上就是Array类的实例,Array类的使用可以说是使用最频繁的,只是大家在使用时都没太在意,如在创建数组int[]时实际上就创建了一个Array类对象的实例。
    最近我仔细研究了一下C#中的Array及ArrayList类之间的异同,总结了以下几点:

    [Array和ArrayList的区别]

    #1. Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明。
    如:
    int[] array = new array[3];
    或 int[] array = {1,2,3};
    或 ArrayList myList = new ArrayList();
    这些都是合法的,而直接使用 int[] array;是不行的。

    #2. Array只能存储同构的对象,而ArrayList可以存储异构的对象。
    同构的对象是指类型相同的对象,若声明为int[]的数组就只能存放整形数据,string[]只能存放字符型数据,但声明为object[]的数组除外。
    而ArrayList可以存放任何不同类型的数据(因为它里面存放的都是被装箱了的Object型对象,实际上ArrayList内部就是使用"object[] _items;"这样一个私有字段来封装对象的)

    #3 在CLR托管对中的存放方式
    Array是始终是连续存放的,而ArrayList的存放不一定连续。

    #4 初始化大小
    Array对象的初始化必须只定指定大小,且创建后的数组大小是固定的,
    而ArrayList的大小可以动态指定,其大小可以在初始化时指定,也可以不指定,也就是说该对象的空间可以任意增加。

    #5 Array不能够随意添加和删除其中的项,而ArrayList可以在任意位置插入和删除项。


    [Array和ArrayList的相似点]

    #1 都具有索引(index),即可以通过index来直接获取和修改任意项。
    #2 他们所创建的对象都放在托管堆中。
    #3 都能够对自身进行枚举(因为都实现了IEnumerable接口)。


    [ArrayList的一些特性]

    #1 在研究ArrayList我发现了一个有趣的现象,ArrayList的capacity属性值会随ArrayList中的项的实际大小来发生改变,
    如下代码:

    public static void Main(string[] args)
              {
                  ArrayList myList = new ArrayList(2);
                  Console.WriteLine("initial capacity:" + myList.Capacity);

                  int size = 2;
                  for (int i = 0; i < size;i++ )
                  {
                      myList.Add(i);
                  }
                  Console.WriteLine("current capacity:" + myList.Capacity);
                
                  Console.ReadLine();
              }

    当size为2时,输出结果中的"current capacity"为2,
    当size为3或4时,"current capacity"为4,
    当size为5~8时,"current capacity"为8,
    当size为9~16时,"current capacity"为16,
    ...
    通过实验可以得出一个结论,那就是每当ArrayList中的实际存在的对象数(ArrayList.Count)超过了自身的Capacity阀值,那么该阀值会自动翻倍。
    (也可以改变myList生成时的初始值来试试,但结论是一样的)

    #2 通过ArrayList类的TrimToResize()方法可以将ArrayList实例中的空项去除以压缩体积。
    如以下代码:

    public static void Main(string[] args)
              {
                  ArrayList myList = new ArrayList(5);

                  for (int i = 0; i < 3; i++)
                  {
                      myList.Add(i);
                  }
                  Console.WriteLine("actual capacity:" + myList.Capacity);
                  myList.TrimToSize();
                  Console.WriteLine("compressed capacity:" + myList.Capacity);
                
                  Console.ReadLine();
              }

    输出:
    actual capacity:5
    compressed capacity:3

    #3 在C#2.0中,建议大家尽量使用范型版的ArrayList,即System.Collection.Generics命名空间下的List<T>,
    这样不但保证了类型安全,而且由于没有了装箱和拆箱的过程,从而提高了对象处理的效率。



    分享到:
  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/qqflying/p/929512.html
Copyright © 2011-2022 走看看