各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
6. Queue
7. SortedList
8. Stack
10. StringDictionary
首先,先分几个大方向,再来判断说,你需要做到的功能,那几个Collection可以做到,效能也较好.
需要做排序 :
。ArrayList:系结唯读的排序资料到DataGrid上,如果只是要使用ArrayList的Indexes去系结唯读的资料,用ArrayList会比使用SortedList好,举例来说,这资料要用来显示在唯读的DataGrid上,这资料已经检索并排序好在ArrayList供显示.
。NameValueCollection:用在字串排序上.
。SortedList:会在建立Collection时,就先排序好资料,所以在建立时是很耗效能在排序清单上,但是如果有少量资料异动或新增时,它会自己排序,其效能就会很好, SortedList适用在大部份是静态也很少被异动的情况,也就是被排序的资料很少异动.
需要做搜寻 :
。Hashtable:找寻随机而具有Key/Value的资料.
。StringDictionary:找寻随机的字串资料.
。ListDictionary:用在Size小于10的资料.
需要依Index去读取每个Element的值 :
。ArrayList与StringCollection:可以用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. |
|
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好,且型别安全.
|

浙公网安备 33010602011771号