数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

线性表和非线性表:

  • 线性表:线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。比如数组、链表、队列、栈等
  • 非线性表:在非线性表中,数据之间并不是简单的前后关系。比如:二叉树、堆、图等

连续的内存空间和相同的数据类型保证了数组随机访问高效,但是弊端是增加修改删除比较慢,为了保证连续性,就需要做大量的数据搬移工作。

如何选择用数组还是容器:

  • Java ArrayList 无法存储基本类型,比如 int、long,需要封装为 Integer、Long 类
  • 如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。
  • 当要表示多维数组时,用数组往往会更加直观。

链表

缓存淘汰策略LRU:

  • 先进先出策略 FIFO
  • 最少使用策略
  • 最近最少使用策略

数组和链表区别:

  • 数组需要连续内存空间,链表不需要,它通过“指针”将一组零散的内存块串联起来使用
  • 数组随机访问性能快,链表随机访问性能差;数组进行增删改时,需要进行大量的数据迁移,链表不需要,只需要修改指针指向节点即可,速度较快

链表的类型:

  • 单链表

头节点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表
尾节点指针不是指向下一个结点,而是指向一个空地址 NULL

  • 双向链表

单链表只有一个方向,但是双向链表有两个方向,每个结点不止有一个后继指针 next 指向后面的结点, 还有一个前驱指针 prev 指向前面的结点。

  • 循环链表

和单链表一样,不同的区别在于循环链表尾节点指向链表的头结点,而不是NULL