System.Collections
ArrayList
在C#中,数组由于是固定长度的,由于这种限制不方便,所以出现了ArrayList
ArrayList是可变长数组,可以将任意多的数据Add到ArrayList里面。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。
但是ArrayList也有一个缺点,就是存入ArrayList里面的数据都是Object类型的,所以如果将值类型存入和取出的时候会发生装箱、拆箱操作(就是值类型与引用类型之间的转换),这个会影响程序性能。在.Net 2.0泛型出现以后,就提供了List
List
List
就性能来说,如果要存进数组的只有一种数据,那么无疑List
List存储的数据是有序并且可以重复的。 采用链表存储数据
1 | List<int> ListInt = new List<int>(); |
HashTable
HashTable是一种根据key查找非常快的键值数据结构,不能有重复key,而且由于其特点,其长度总是一个素数,所以扩容后容量会比2倍大一点点,加载因子为0.72f。
当要大量使用key来查找value的时候,HashTable无疑是最有选择,HashTable与ArrayList一样,是非泛型的,value存进去是object,存取会发生装箱、拆箱,所以出现了Dictionary<T,T>
1 | // 属性 |
Dictionary<T,T>
Dictionary<T,T>是HashTable的泛型版本,存取同样快,但是不需要装箱和拆箱了。而且,其优化了算法,Hashtable是0.72,它的浪费容量少了很多
1 | Dictionary<string,Person> Dic = new Dictionary<string,Person>(); |
HashSet
HashSet
HashSet存储的数据是无序并且唯一的,底层使用HashMap存储数据
Add(T) 方法返回值为如果该元素添加到 HashSet
1 | HashSet<int> numbers1; |
Queue、Queue
Queue队列,Queue
1 | // 属性 |
Stack、Stack
Stack堆栈,先进后出
1 | // 属性 |
SortedList、SortedList<TKey,TValue>
SortedList集合中的数据是有序的。可以通过key来匹配数据,也可以通过int下标来获取数据
添加操作比ArrayList,Hashtable略慢;查找、删除操作比ArrayList快,比Hashtable慢
SortedDictionary<TKey,TValue>
SortedDictionary<TKey,TValue>相比于SortedList<TKey,TValue>其性能优化了,SortedList<TKey,TValue>其内部维护的是数组而SortedDictionary<TKey,TValue>内部维护的是红黑树(平衡二叉树)的一种,因此其占用的内存,性能都好于SortedDictionary<TKey,TValue>。唯一差在不能用下标取值
ListDictionary(单向链表),LinkedList(双向链表)
List
ListDictionary是单向链表
LinkedList
HybridDictionary
HybridDictionary的类,充分利用了Hashtable查询效率高和ListDictionary占用内存空间少的优点,内置了Hashtable和ListDictionary两个容器,添加数据时内部逻辑如下:
当数据量小于8时,Hashtable为null,用ListDictionary保存数据
当数据量大于8时,实例化Hashtable,数据转移到Hashtable中,然后将ListDictionary置为null
BitArray
BitArray用于二进制运算,”或”、”非”、”与”、”异或非”等这种操作,只能存true或false
字符串动态匹配算法
BF算法
RK算法
BM算法
KPM算法
Sunday算法
动态规划
可理解为数列求通项过程
f(n) = f(n - 1) + f(n - 2)
逻辑运算符短路效应
1 | if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false |