各Collection阵列个别特性列表

首先Collection和Map是两个毫无关系的接口,Collection是对象集合,Map是键值对集合

Collection有两个子接口List和Set 
List可以通过下标(1,2..)来取得值,值可以重复
而Set只能通过游标来取值,并且值是不能重复的
ArrayList,Vector,LinkedList是List的实现类
ArrayList是线程不安全的,Vector是线程安全的,这两个类底层都是由数组实现的
LinkedList是线程不安全的,底层是由链表实现的
HashTable和HashMap是Map的实现类
HashTable是线程安全的,不能存储null值
HashMap不是线程安全的,可以存储null值

 

写程式时,常会用到一些阵列来储存资料,但什么时候要用什么样的阵列,好像很少去想过这个问题,大多就直接的拿来就用,这里整理了一下几个阵列的特性及使用时机.

 

一般常用的几个阵列如下 :

1. ArrayList

2. Hashtable

3. HybridDictionary

4. ListDictionary

5. NameValueCollection

6. Queue

7. SortedList

8. Stack

9. StringCollection

10. StringDictionary

 

首先,先分几个大方向,再来判断说,你需要做到的功能,那几个Collection可以做到,效能也较好.

需要做排序 :

ArrayList:系结唯读的排序资料到DataGrid上,如果只是要使用ArrayList的Indexes去系结唯读的资料,用ArrayList会比使用SortedList好,举例来说,这资料要用来显示在唯读的DataGrid上,这资料已经检索并排序好在ArrayList供显示.

NameValueCollection:用在字串排序上.

SortedList:会在建立Collection时,就先排序好资料,所以在建立时是很耗效能在排序清单上,但是如果有少量资料异动或新增时,它会自己排序,其效能就会很好, SortedList适用在大部份是静态也很少被异动的情况,也就是被排序的资料很少异动.

 

需要做搜寻 :

Hashtable:找寻随机而具有Key/Value的资料.

StringDictionary:找寻随机的字串资料.

ListDictionary:用在Size小于10的资料.

 

需要依Index去读取每个Element的值 :

ArrayListStringCollection:可以用Index去取值.

Hashtable , SortedList , ListDictionary , StringDictionary:可以用Key的名字去取值.

NameValueCollection:可以用Index或是Key的名字去取值.

 

接下来再介绍这几个阵列的特性.

ArrayList  :

  可以动态依资料的新增,而去增加他的容量的大小,以下是它的几个使用建议.

。储存自定物件型别及资料变​​更频繁,需要频繁的插入及删除.

。当资料异动完,使用TrimToSize去将ArrayList的容量调整到与实际资料一样的大小,并对记忆体配置做调整,必需注意一点,在TrimToSize之后,尽量避免再去新增资料,因为ArrayList容量必需再动态变大,而Trim过后记忆体配置可能没有空间拓大,记忆体会再重新配置,所以效能会比较差.

。储存排序过后的资料与使用ArrayList.BinarySearch进行有效率的搜寻,排序与循序搜寻是使用耗资源的Contains方式.它是适用在一次性排序资料,如果需要频繁的排序,那么SortedList会比较有效率多了,因为当资料有异动时,它会自动重新排序.

避免使用ArrayList去储存String,String最好还是用StringCollection比较好.

 

Hashtable  :

  使用一对Key/Value的方式来储存资料,配置方式是依照杂凑值.

。适用在储存大量的记录及异动量低的资料,频繁的异动资料,会因为重新计算杂凑值去跟其它资料进行比对的额外成本.

。Hashtable适用在频繁的查询资料,例如人员资料,UserNo就是Key,可以用这个Key去快速的找出Value.

 

HybridDictionary  :

  汽车有油电混合系统,Collection也有混合版的,HybridDictionary当资料量小的时候,它可以像是ListDictionary的使用,如果量大,可以像Hashtable一样新增容量.

。排序的资料,大部份的时间都不多,只有偶尔新增容量,如果确定资料很多或很少,就建议使用Hashtable与ListDicrionary.避免HybirdDictionary频繁的在这两种集合切换而造成的额外成本.

。适合频繁的查询资料.

。不要使用HybridDictionary来排序资料,它在排序的效能不好.

 

ListDictionary  :

  建议使用在储存少量的资料(少于10笔),因为它是使用单向连结串列来实作IDictionary.在少于10笔的情况下,它会比Hashtable更小更快,如果大于10笔,就不应该使用ListDictionary.

 

NameValueCollection  :

  使用String的Key与Value,所以可以用Key或者是Index来取值.

。可以排序Key/Value,而且Key值可以重覆.

。适用频繁的异动资料.

。适合储存需快速取出的资料.

 

Queue  :

  先进先出FIFO的物件集合.

。适用依接收顺序,循序读取资料.

。因为FIFO的关系,所以在加入时,要注意顺序.

。如果需要用String去读取资料,最好是使用NameValueCollection.

 

SortedList  :

  SortedList使用一对Key/Value的方式来储存资料,所以可以依其索引及Key值进行存取,索引的顺序是根据排序的顺序,所以加入时,会依其排序加入到SortedList内,而Index也会相对应调整,所以当有资料异动时,它会较耗资源.

。适用在大部份是很少变动的资料.

。适用于使用Key或Index去快速取得排序后的资料.

。避免使用SortedList在大量异动的资料,其效能成本会很高,这情况之下,反而建议使用ArrayList.

。避免使用SortedList去排序String,这也会有额外的成本产生,建议使用StringCollection.

。因为排序的关系,通常在SortedList上进行的速度比Hashtable慢.

 

Stack  :

  Stack跟Queue刚好相反,Stack是后进先出LIFO的方式.

。适合储存LIFO的资料,例如:最近10个登入的人员.

。如果知道预计容量,在初始化时,最好就定义好大小,预设是10.

。适用在运作时,可以抛弃Item的情况.

。Stack适用在不需任意从阵列中读取某一笔,只需LIFO的读取.

 

StringCollection  :

  StringCollection是Strongly typed的ArrayList,用来储存String的阵列.

。用来储存异动频繁且大量的String资料.

。使用StringCollection去Binding String资料到DataGrid,可以避免在读取时转换为String的成本.

。不要使用StringCollection去排序字串或储存预先排序好的资料.

 

StringDictionary  :

  跟Hashtable一样,Index与Value是强型别的String,而不是使用Object.

。适用在资料不需频繁的异动,因为底层架构是Hashtable,使用来排序强型别的字串.

。用在储存静态的资料,频繁搜寻的资料.

。如果是要储存String,永远记得使用StringDictionary比Hashtable好.

 

简表 :

Type

描述

ArrayList

动态变动阵列的容量,当你在设计阶段不知道它可能的容量时,ArrayList就很好用.

Hashtable

使用一对Key/Value的方式来储存资料,配置方式是依照杂凑值.适用在搜寻上,而不适用在排序.

HybridDictionary

当资料量小的时候,它会使用ListDictionary,资料量大的时候,它会切换为Hashtable.

ListDictionary

在储存10笔以下的Key/Value很好用.

NameValueCollection

String的Key/Value可以用来排序,可用Key或Index来存取资料.

Queue

先进先出FIFO的阵列.

SortedList

Key/Value的阵列,依Key排序及用Key或Index来存取资料.

Stack

后进先出LIFO的阵列.

StringCollection

强型别的String阵列

StringDictionary

跟Hashtable一样,Index与Value是强型别的String,而不是使用Object.

 

 

 

  在.Net 1.1之后,在Collection有陆续的一些改善,之前有提到,Collection有泛型的Boxing/Unboxing问题,所以在.Net 2.0开始,就推出了一些改善过的Collection出来,在.Net 1.1所使用的namespace是System.Collections,新的是不同的namespace System.Collections.Generic.
 

 

Type
对应无泛型Type
描述
Dictionary<TKey,TValue> Hashtable
*加入的项目都是由值与关联索引组成,用索引键读取的效率高[接近O(1)],实作是杂凑资料表.
*Key不能Null,Value可以为Null
HashSet<T>  
* HashSet只有一个值,这个集合没有特定顺序,也不可重覆,容量会自动增加.
*如果Count小于内部阵列容量,采O (1)计算,如果必需要调整HashSet大小,则是采O (n)
*Comparer/Contains的效能很好,是O (1)运算
LinkedList<T>  
*插入/移除/Count都是O (1)运算,所以效能很好.
*唯一支援多执行绪的读取.
*资料可重覆.
*因为是双向连结串列,因此每个节点都向前指向Next,向后指向Previous
*接受Null
List<T> ArrayList
*这两个型别的行为相同,最主要的差别在泛型.
*在大多数​​的情况下,List<T>的效能较ArrayList好,且型别安全.
*执行BinarySearch前,要先排序.
*接受Null
Queue<T> Queue
*这两个型别的行为相同,最主要的差别在泛型.
*在大多数​​的情况下, Queue <T>的效能较Queue好,且型别安全.
SortedDictionary<TKey, TValue>  
* SortedDictionary<TKey, TValue>用的记忆体比SortedList<TKey,TValue>多.
* SortedDictionary<TKey, TValue>对未排序资料做新增移除比SortedList<TKey,TValue>快.
* SortedDictionary<TKey, TValue>从排序的资料做一次性新增比
SortedList<TKey,TValue>慢.
SortedList<TKey, TValue> SortedList
Stack<T> Stack
*这两个型别的行为相同,最主要的差别在泛型.
*在大多数​​的情况下, Queue <T>的效能较Queue好,且型别安全.
posted @ 2013-12-02 11:50  fuddy-duddy焕  阅读(189)  评论(0)    收藏  举报