常见的集合类型有:List、ArrayList、LinkedList、SortedList、Dictionary、HashTable、HashSet、Stack、Queue。
1 List类
表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。
命名空间:System.Collections.Generic
List集合底层是由数组封装的,由于数组不可改变大小,因此List集合在封装的数组存储满了时,需要重新创建一个容量更大的新数组。
在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。
优点:访问元素的效率比较高;
缺点:删除和添加元素效率低,因为要操作大量的元素
List<int> list = new List<int>();
2 ArrayList
使用大小会根据需要动态增加的数组来实现 IList 接口。
命名空间:System.Collections
ArrayList是可变长数组,是非线程安全的集合。你可以将任意多的数据Add到ArrayList里面。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。
但是ArrayList也有一个缺点,就是存入ArrayList里面的数据都是Object类型的,所以如果将值类型存入和取出的时候会发生装箱、拆箱操作(就是值类型与引用类型之间的转换),这个会影响程序性能。
ArrayList myAL = new ArrayList();
3 LinkedList
表示双重链接列表。
命名空间:System.Collections.Generic
LinkedList 是基于双向链表实现的非线程安全的集合,ArrayList 在新增和删除元素时,因为涉及到数组复制,所以效率比 LinkedList 低,而在遍历的时候,ArrayList 的效率要高于 LinkedList。
LinkedList是一个链表结构,不能像数组一样随机访问,必须是每个元素依次遍历直到找到元素为止。
其结构的特殊性导致它查询数据慢。
LinkedList<int> a = new LinkedList<int>();
4 SortedList
表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
命名空间:System.Collections
SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。
SortedList是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。
如果使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。键不能为null,但值可以。
SortedList sl = new SortedList();
5 Dictionary<k,v>
键值对
含名空间 :System.Collection.Generic
Dictionary里面的每一个元素都是一个键值对。键是唯一的,值不需要唯一,键和值都可以是任何类型(比如:string, int, 自定义类型等等)
通过一个键读取一个值得时间接近O(1),单线程中推荐使用Dictionary,有泛型优势,且读取速度较快,容量利用更充分。
Dictionary<string, string> dictExecutes = new Dictionary<string, string>();
6 HashTable
表示根据键的哈希代码进行组织的键/值对的集合。
命名空间:System.Collections
Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key和value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对。
HashTable是线程安全的,他的key和value都不可以为null。
Hashtable hashtable = new Hashtable();
7 HashSet
表示值的集。
命名空间:System.Collections.Generic
HashSet是一个高性能且无序的集合,所以Hashset不能做排序操作。由于HashSet无序,所以只能使用foreach来进行迭代,而无法使用for循环(不能操作索引)。
HashSet中的元素不重复(可以存放单一的null),即具有元素唯一性,若向 HashSet 中插入重复元素,其内部会忽视此次操作,不会报出异常。如果有一个具有唯一值的集合,推荐HashSet。
HashSet<string> hashSet = new HashSet<string>();
8 Stack
表示对象的简单后进先出 (LIFO) 非泛型集合。
命名空间:System.Collections
栈:先进后出
Stack s = new Stack();
9 Queue
表示对象的先进先出集合。
命名空间:System.Collections
队列:先进先出
Queue q = new Queue();