数组Array:顺序存储结构
优点:按位置索引很快,修改效率高。
缺点:需声明存放类型,且只能存放相同类型,必须指定长度(过长浪费,过短溢出),插入与删除很慢(排除特殊情况)。

数组ArrayList:顺序存储结构,解决了Array的缺点,由源码得知,默认容量为4,容量自增2倍。
不过由于容量是类成员,自增机制会引发线程安全问题,所以ArrayList不是线程安全的。
优点:无需指定长度,无需声明存放类型,可存放不同类型元素,底层是object,顺序存储结构常有优点这里都有。
缺点:由于底层元素是object,当为值类型时,存在装箱/拆箱操作,效率降低,且可能会有非类型安全问题。顺序存储结构常有缺点这里都有。

数组List:顺序存储结构,综合Array和ArrayList的优点,所以List也不是线程安全的。
优点:无需指定长度,长度自增。需声明存放类型,内部用Array实现,保证了类型安全。
缺点:顺序存储结构常有缺点都有。
所以现在基本上不使用Array和ArrayList,而是使用List。

双向链表LinkList:链式存储结构,非线程安全,可自己加锁实现线程安全。
优点:插入,删除效率高,只需修改指针域的前驱节点和后继节点即可进行插入删除。
缺点:无法基于位置索引,必须从头结点依次遍历。

队列Queue:顺序存储结构,先进先出集合。由官方文档得知,非线程安全,但是其有线程安全的的队列实现为ConcurrentQueue
默认容量为32,容量自增为4(.net framework 4.8),其他版本可能会有变化。

栈Stack:顺序存储结构,后进先出集合,默认容量10,容量自增2倍。非线程安全。

递归算法

  • 公式法求复杂度:

  • 公式法

  • 三种情况

  • 例一

  • 例二

  • 例三

回溯法

经典找集合总和的算法

NQueen算法:
回溯法NQueen

算法复杂度:
NQueen算法复杂度

  • 题外:关于ref, out的区别
    1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。