Skip to content

数组结构

  1. 数组
  2. 链表
  3. 队列

数组基础知识#

数组在内存中的表现为 一段连续的内存。在 Java 中声明一个长度为 5 的数组:

int[] arr = new int[5];

在内存中开辟长度为 5 的连续空间。

image-20241214163245556

每个空间会有对应的内存地址。

arr 其实存储的是第一个空间的内存地址,例如上图中的 0xab0001.

下标是从 0 开始的。下标背后的含义:是内存地址的偏移量。现在你就知道了为什么下标是从零开始,因为第一个元素不需要偏移。

数组常见的操作

  1. 查询:在数组中要取到一个值是很快的,直接通过内存地址偏移 xxx 个单位就能够拿到
  2. 新增或者删除:需要将后面所有的元素全部前移或者后移。

JS中数组#

JS 中其实没有数组这种数据结构。

const arr = [1, 2, 3]

在标准的数据结构中,数组应该是具有固定大小固定类型线性数据结构,其每个元素在内存中是 连续存储 的。访问这些元素通常是通过索引(下标)进行的,且由于内存是连续分配的,所以在访问时具有很高的性能。

而 JS 中的数组实际上是一个 类数组对象

const arr = {
0: 1,
1: 2,
}
arr[0] // 1
arr[1] // 2
const 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-