数组
数组是一种线性表数据结构.它用一组连续的内存空间, 来存储一组具有相同类型的数据,
连续的内存空间, 保证数组的数据都连续的分布在物理介质上.
拥有随机访问和快速访问的优势,
快速访问: CPU读取数据一般是取出一块儿连续的内存空间, 非常适合存取数组结构
但是有需要连续内存的缺点.
链表
链表是一种物理存储单元上非连续、非顺序的线性存储结构,
通过指针将一组零散的内存块(结点)串联在一起.
组成链表的结点可以在运行时动态生成, 非常适合元素的增, 删操作
但访问查找是线性的, 必须一个结点一个结点的遍历.常结合散列表克服访问的限制
散列表
散列表其实是数组的一种扩展, 用的是数组支持按照下标随机访问数据的特性
可以支持非常高效的数据插入, 删除, 查找操作
但是散列表中的数据都是通过散列函数打乱之后无规律存储的,
而且散列表是动态数据结构, 数据一直在改变.
为了以某种顺序快速地遍历数据, 可以结合散列表与链表(或跳表)
栈和队列
数据结构都是为了某些使用场景建立, 栈和队列的使用场景更加明确
栈是遵循操作顺序先进后出LIFO: last in first out),
操作受限(只允许在一端插入或删除)的线性数据结构
根据实现可以分为, 顺序栈: 数组实现的栈; 链式栈: 链表实现的栈
队列是遵循操作顺序先进先出LIFO: last in first out,
操作受限(只允许在一端插入;在另一端删除)的线性数据结构
当某个数据集合在一端插入, 一端删除数据,并且满足先进先出,我们就应该首选“队列”这种数据结构
队列也可以用数组(顺序队列)和链表(链表队列)实现, 但是出队操作后, 顺序队列的前几位变为空位, 达到队列上限后需要进行数据搬移,最坏时间复杂度变为O(n).为了避免数据搬移操作,就有了循环队列.
内存中的堆栈和数据结构堆栈的区别
内存中的堆栈是真实存在的物理区, 数据结构中的堆栈是抽象的数据存储结构.
内存空间在逻辑上分为三部分: 代码区, 静态数据区和动态数据区, 动态数据区又分为栈区和堆区.
代码区: 存储方法体的二进制代码.高级调度(作业调度), 中级调度(内存调度),
低级调度(进程调度)控制代码区执行代码的切换.
静态数据区: 存储全局变量, 静态变量, 常量, 常量包括final修饰的常量和String常量.系统自动分配和回收.
栈区: 存储运行方法的形参, 局部变量, 返回值.由系统自动分配和回收.
堆区: new一个对象的引用或地址存储在栈区, 指向该对象存储在堆区中的真实数据.
考虑优先级
数据结构和算法的重要性排行榜: 连续空间 > 时间 > 碎片空间