`
cdragon
  • 浏览: 77170 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

effective hierarchy(一)之 从array说起(3)

阅读更多

回顾:

从上一节中,可以看出枚举的易用性对数组使用的启示意义。

 

一、ArrayList

1.基础

(1)使用边界动态按需增长的数组实现IList接口,语法为

        [SerializableAttribute]
        [ComVisibleAttribute(true)]
        public class ArrayList : IList, ICollection, IEnumerable, ICloneable

(2)执行需要排序的操作前,必须对ArrayList排序;

(3)一个ArrayList的容量是它能够容纳(hold)的元素数量;

(4)当元素使用Add()增加到一个ArrayList时,容量通过重新分配自动按需增加;

(5)通过调用TrimToSize()或显示设置Capacity属性减少容量;

(6)集合中的元素使用整数索引来访问,集合的索引值从0开始;

(7)ArrayList集合接受null引用为合法值,并且允许元素值重复;

(8)因为实现了IEnumberable,故可使用foreach遍历。

 

2.注意事项

线程安全:如果集合没有被修改,ArrayList可以支持并行的多“读者”(reader);要确保线程安全,所有操作必须通过“包装者”(wrapper)进行,该包装者由同步方法(Synchronized method)返回。

 

枚举的过程原(intrinsically)本就不是线程安全的过程(procedure),即使集合被同步,其它的线程仍能够修改集合,且引发枚举器(enumerator)抛出异常。要确保在枚举的过程中的线程安全,要么对枚举进行全程锁定(lock),要么捕捉由其它线程引起变化对应的异常(exception)结果。

 

二、Queue

1.基础

(1)先进先出(FIFO)的对象集合(collection);语法为

        [SerializableAttribute]
        [ComVisibleAttribute(true)]
        public class Queue : ICollection, IEnumerable, ICloneable

 

 (2)队列用在对按照接收的顺序储存的信息进行线性处理(sequential processing),该类实现了闭环数组,即存储在队列中的数组从一端进入,从另一端移出;

(3)队列的容量是指队列能够支持的元素个数;元素使用Enqueue()增加到队列时,容量自动地扩充;使用TrimToSize减少容量;

(4)增量因子决定扩容的大小,在队列建立时创建,默认为2.0;但最小以4增加;

(5)队列接收空引用为合法,且允许重复元素。1.0的增量因子是以容量加4进行;

(6)队列具有泛型类型;语法为

        [SerializableAttribute]
        [ComVisibleAttribute(false)]
        public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable

 

2.注意

枚举的过程原(intrinsically)本就不是线程安全的程序(procedure),即使集合被同步,其它的线程仍能够修改集合,且引发枚举器(enumerator)抛出异常。要确保在枚举的过程中的线程安全,要么对枚举进行全程锁定(lock),要么捕捉由其它线程引起变化所对应的异常(exception)结果。 

 

三、栈

1.基础

(1)表示简单的-对象后进先出(LIFO)非泛型的集合(collection);语法为

        [SerializableAttribute]
        [ComVisibleAttribute(true)]
        public class Stack : ICollection, IEnumerable,ICloneable
(2)栈是一种闭环缓冲区实现(implementation);

(3)栈的容量是栈能支持的元素数量;通过push()向栈中按需增加元素时,它的容量通过自动重新分配来增加;

(4)如果"Count"小于栈的容量,push是一个O(1)操作;容量需要增加时,是一个O(n)操作,n等于"Count";"Pop"是O(1)操作;

(5)空引用在栈中是合法值,允许元素的值重复;

(6)栈有泛型版本;语法为

   [SerializableAttribute]
   [ComVisibleAttribute(false)]
   public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable

2.注意

枚举的过程原(intrinsically)本就不是线程安全的程序(procedure),即使集合被同步,其它的线程仍能够修改集合,且引发枚举器(enumerator)抛出异常。要确保在枚举的过程中的线程安全,要么对枚举进行全程锁定(lock),要么捕捉由其它线程引起变化所对应的异常(exception)结果。 

 

//主要用途示例

using System;
using System.Collections;
public class SamplesArrayList  {

   public static void Main()  {

      // Creates and initializes a new ArrayList.
      ArrayList myAL = new ArrayList();
      myAL.Add("Hello");
      myAL.Add("World");
      myAL.Add("!");

      // Displays the properties and values of the ArrayList.
      Console.WriteLine( "myAL" );
      Console.WriteLine( "    Count:    {0}", myAL.Count );
      Console.WriteLine( "    Capacity: {0}", myAL.Capacity );
      Console.Write( "    Values:" );
      PrintValues( myAL );
   }

   public static void PrintValues( IEnumerable myList )  {
      foreach ( Object obj in myList )
         Console.Write( "   {0}", obj );
      Console.WriteLine();
   }

}


/* 
This code produces output similar to the following:

myAL
    Count:    3
    Capacity: f
    Values:   Hello   World   !

*/

  

-----------------------------------------------

小结:典型的集合(collection)的三个分类,分别是ArrayList、Queue和Stack。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics