Fork me on GitHub

《ArrayList》---集合

          这两天太懒了昨晚又通宵玩了一夜游戏今天补睡了一天,所以进度慢了点,不过也没啥,每天进步一点点就行了,哈哈。

我在前面介绍了数组,有些网友问我咋把数组放到集合里讨论,其实数组就是我们最常用的一种集合,所有的数组都是从System.Array类继承下来的,今天其实主要的内容是集合构造的效率问题,也就是我今天的主题----扩容。今天只以ArrayList为例,但是它适用与所有的集合(当然包括数组)。书面一点说就是System.Collections命名空间中的所有集合在到达当前的容量时都会自动扩容,内存被重新分配,元素从旧的集合复制到新的集合,这虽然减小了所需代码,但是集合的性能会有所降低,避免这种性能降低的情况的最好方法就是将初始容量设置为一个合理的估计大小。ArrayList允许空引用为有效值,也允许重复的元素。

首先熟悉一下ArrayList常见的属性和方法的使用代码如下:

 


 

 

 using System;

using System.Collections;

namespace ArryList

{

    class Program

    {

        static void Main(string[] args)

        {

            ArrayList Schoolbag = new ArrayList();

            Schoolbag.Add("《大学语文》");

            Schoolbag.Add("《高等数学》");

            Schoolbag.Add("《传播学》");

            Console.WriteLine("书包中的容量为{0},其中有{1}本书",Schoolbag.Capacity,Schoolbag.Count);

            Console.WriteLine("书包中的书名分别为:");

            int num1=0;

            for (int i = 0; i < Schoolbag.Count;++i )

            {

                Console.WriteLine("{0}-{1}",++num1 , Schoolbag[i]);  

            }

            if(Schoolbag.Contains("《广告史》"))

            {

            Console.WriteLine("书包中有《广告史》");

            }

            else

            {

            Console.WriteLine("书包中没有《广告史》");

            Console.WriteLine("书包中添加了《广告史》");

            Schoolbag.Add("《广告史》");

            }

            Console.WriteLine("删除《高等数学》");

            Schoolbag.Remove("《高等数学》");

            Console.WriteLine("为书包添加书本");

            Schoolbag.Add("《视觉传播》");

            Schoolbag.Add("《市场调研》");

            Schoolbag.Add("《广告法规》");

            Schoolbag.Add("《广告经营与管理》");

            Console.WriteLine("添加书本后书包的容量变为{0},此时书包中的书数为{1}",Schoolbag.Capacity,Schoolbag.Count);

            Console.WriteLine("书包中的书名分别为:");

            System.Collections.IEnumerator Mysheet = Schoolbag.GetEnumerator();

            Console.WriteLine("书包中的书名分别为:");

            int num2=0;

            while ((Mysheet.MoveNext()) && (Mysheet.Current != null))

            {

                Console.WriteLine("{0}-{1}",++num2,Mysheet.Current);

            }

                Console.ReadKey();

        }

    }

}


再来测试一下两种构造函数的效率问题,代码如下:

 

 

using System;

 

 

using System.Collections;

 

namespace ArrayList_Performance

{

    class Program

    {

        public const int Max_num = 100000;

        static void Main(string[] args)

        {

            DateTime timer1 = DateTime.Now;

            ArrayList arr1 = new ArrayList();//使用常规默认的构造函数

            //初始化arr,自动扩容

            for (int i = 0; i <= Max_num; i++)

            {

                arr1.Add(i);

            }

            DateTime timer2 = DateTime.Now;

            TimeSpan ts1 = timer2.Subtract(timer1);//计算处理时间

            double ms1 = ts1.TotalMilliseconds;

            Console.WriteLine("使用ArrayList()构造函数处理的时间为{0}毫秒", ms1);

            DateTime timer3 = DateTime.Now;

            ArrayList arr2 = new ArrayList(Max_num);

            for (int i = 0; i <= Max_num; ++i)

            {

                arr2.Add(i);

            }

            DateTime timer4 = DateTime.Now;

            TimeSpan ts2 = timer4.Subtract(timer3);

            double ms2 = ts2.TotalMilliseconds;

            Console.WriteLine("使用ArrayList(int capacity)构造函数处理的时间为{0}毫秒", ms2);

            TimeSpan ts = ts1.Subtract(ts2);

            double ms = ts.TotalMilliseconds;

            Console.WriteLine("后一种构造函数计算时长缩短了{0}毫秒", ms);

            Console.ReadKey();

        }

    }

}


 

posted @ 2012-03-07 20:17  Halower  阅读(353)  评论(0编辑  收藏  举报