- 数组
- 链表
- 栈
- 队列
数组基础知识#
数组在内存中的表现为 一段连续的内存。在 Java 中声明一个长度为 5 的数组:
int[] arr = new int[5];在内存中开辟长度为 5 的连续空间。

每个空间会有对应的内存地址。
arr 其实存储的是第一个空间的内存地址,例如上图中的 0xab0001.
- arr[0] :数组第一个元素
- arr[2]: 数组的第三个元素
下标是从 0 开始的。下标背后的含义:是内存地址的偏移量。现在你就知道了为什么下标是从零开始,因为第一个元素不需要偏移。
数组常见的操作
- 查询:在数组中要取到一个值是很快的,直接通过内存地址偏移 xxx 个单位就能够拿到
- 新增或者删除:需要将后面所有的元素全部前移或者后移。
JS中数组#
JS 中其实没有数组这种数据结构。
const arr = [1, 2, 3]在标准的数据结构中,数组应该是具有固定大小和 固定类型 的 线性数据结构,其每个元素在内存中是 连续存储 的。访问这些元素通常是通过索引(下标)进行的,且由于内存是连续分配的,所以在访问时具有很高的性能。
而 JS 中的数组实际上是一个 类数组对象。
- 动态大小
- 不同数据类型
- 非连续存储
const arr = { 0: 1, 1: 2,}arr[0] // 1arr[1] // 2const arr = [1, 2]console.log(typeof arr) // object首先要知道 JS 中的数组和传统数组的区别。
后面的学习,我们直接将这种类数组对象当成普通数组来用。
JS数组常用方法#
JS 中数组内置方法很多,这里介绍部分后面会用到的方法。
创建数组
// 字面量方式const arr = [1, 2, 3]// Array 构造函数const arr = new Array(3) // 创建一个长度为 3 的空数组const arr = new Array(1, 2, 3) // 创建一个包含元素 1 2 3 的数组// Array.of// 该方法其实就是为了解决 new Array 处理单个参数时的怪异行为const arr = Array.of(3) // [3]const arr = Array.of(1, 2, 3) // [1, 2, 3]
// 还有其他方式Array.from()扩展运算符添加和删除元素
// push 和 pop// [1, 2]// push是往数组末尾推入一个或多个元素arr.push(3) // [1, 2, 3]arr.push(4, 5, 6);[1, 2, 3, 4, 5, 6]// pop是弹出末尾的一个元素arr.pop() // 6
// 另外一组:unshift 和 shift// unshift是往数组头部推入一个或多个元素// shift弹出数组头部的一个元素修改和查找元素
splice()slice()indexOf()includes()-EOF-