1.线性结构
1.数组
用一组连续的内存空间,来存储一组具有相同类型的数据
数组的随机读写性能是非常好的
数组的随机插入和删除性能不是很好
int arr[] = new int[]{1,2,3}
arr.length;
1. 静态数组
java内置数组是静态数组,长度是固定的。
2. 动态数组
数组进行扩缩容的时候的时间复杂度是O(n)
思考一个问题,如果数组size处于临界值,一会加一个元素,一个删除一个元素,那么是不是这个数组属于频繁的扩缩容状态。会引起“时间复杂度震荡” 。
知识补充
静态数组和动态数组的区别
动态数组不能存储基本数据类型 ,只能存储对象。
2.链表
指针和引用
链表和数组的区别
- 链表是动态的数据结构,链表天然支持动态扩容,数组需要进行resize()扩容
- 链表可以充分的利用非连续的内存空间,提高内存的利用率
- 在存储相同数量的数据时,链表需要的内存空间比数组大
上图中,第三步和第四步执行顺序 不能交换顺序执行的
哨兵节点
使得链表的表头的处理逻辑跟其他节点一致;
3.栈
栈的应用场景
- java方法调用顺序
- 浏览器前进和后退
自己实现一个栈
- 用数组实现
- 用链表实现
java中内置的栈 Stack
4.队列
FIFO 先进先出
用数组实现队列
用链表实现队列
4.1 循环队列
循环队列入队时,尾指针tail的处理
当 head == tail 说明队列为空
队列满了的情况
循环队列的扩缩容
循环队列的遍历
4.2各种队列的实现方式比较和优化
4.3 java中的队列
类图:
双端队列