Arrays Basic
约 759 字大约 3 分钟
什么是数组?
数组(Array)是编程语言中最基本的数据结构。简单来说,它是一个容器,用于存储固定数量的同类型数据。
在 Java 中,数组具有以下三个核心特性:
- 一致性:数组中的所有元素必须是相同的数据类型(如全是
int或全是String)。 - 固定性:数组一旦创建,长度(容量)就固定了,不能动态变大或变小。
- 连续性:在内存中,数组元素是连续存放的。这是数组“随机访问”高效的根本原因。
内存模型(Java)
在 Java 中,数组属于引用类型(Object)。
- 栈内存(Stack):存储数组的引用变量(如
arr),它像一个遥控器,保存着堆内存的地址。 - 堆内存(Heap):存储数组实际的数据元素(如
10, 20, 30)。数组对象在堆中带有一个length属性,用于记录长度。
创建方式
在 Java 中,主要有三种创建数组的方式:
// 方式一:动态初始化(指定长度)
// 适用场景:只知道需要存多少个数据,还不知道具体数据是什么
// 默认值:int为0, double为0.0, boolean为false, 引用类型为null
int[] arr1 = new int[5];
// 方式二:静态初始化(完整写法)
// 适用场景:创建时就已经知道具体数据
int[] arr2 = new int[]{10, 20, 30};
// 方式三:静态初始化(简写,最常用)
// 注意:这种写法只能在声明变量时直接赋值,不能分开写
int[] arr3 = {10, 20, 30};优缺点
优点
随机访问速度快: 主要得益于连续内存和寻址公式,只要知道下标,就能直接定位元素,时间复杂度为 O(1)。
缺点
增删效率低: 因为长度固定,一旦存满想增加元素,必须创建一个新数组把旧数据拷过去;如果在数组中间插入/删除元素,为了保持内存连续性,后续的所有元素都需要向前或向后移动,平均时间复杂度为 O(N)。
核心理论:为什么数组下标从 0 开始?
这涉及到数组的寻址公式。
由于数组在内存中是连续的,计算机可以通过首地址和下标,直接计算出任意元素的内存地址,无需遍历。
寻址公式如下:
参数说明:
base_address:数组的首地址。i:数组下标。data_type_size:数据类型占用的字节数(如int占 4 字节)。
原理分析: 如果下标从 1 开始,公式就会变成:
对比可以看出,从 1 开始每次随机访问都需要多做一次减法运算。为了提升 CPU 效率,Java(沿用了 C 语言的设计习惯)将数组下标设计为从 0 开始。