数组
用连续的内存,存储同一类型的数据;特点随机访问,访问速度块(可以根据公式计算位置),同时删除,插入的速度比较慢 复杂度为o(1) ,在平常的开发中使用程序语音提供的容器就行(比如 Java 的arrrylist ),底层开发的话就是直接使用数组比较好的; 为线性数据结构
链表
所需要的内存不是一整块的,是通过指针将零碎内存拼接的,链表的每个节点除了要存储数据还要存储下个节点的位置;所以所需要内存也是比较大的; 因为链表的存储空间不是连续的,所以也不需要移动,所以删除比较块,同时不是连续的无法计算其位置,需要遍历所以查询是慢的;
单链表
-
循环列表
- 处理环形状数据的时候适用:约瑟夫问题
-
双向链表
- linkhashmap
- 删除制定值的节点中,和单列表没什么区别,当删除指定指针所指向的节点时比单列表快一些,双向的节点信息保存到前一个节点的指指针内,所以也是可以用公式,推算出来的;
<mark style="box-sizing: border-box;">数组和链表的最大区别还是扩容问题,同时数组和链表都是有顺序的</mark>
栈
栈,先进后出的情况,在日常应用中有很多的的用处,双栈的设计可以解决很多应用问题,可以扩容,其出入复杂度为O(n),基本栈的出入栈的复杂度为O(1),是用数组和链表实现的
队列
队列的先进先出,也是可以用数据和链表来实现;
-
循环对列:
- 循环队列的好处,不用移动数据,提升了效率
阻塞队列:阻止队列的出和入
并发队列:解决线程安全的队列,循环队列加力度锁可以更好的实现并发队列;